71 条题解
-
2不退 LV 8 @ 2018-06-01 23:37:00
题目很简单,不用多说什么……
主要是想向大家推荐一下前缀和优化的办法~~~
能快2~3倍(亲测)#include<iostream> using namespace std; int a,b,ans,tot; int l[1005],q[1005]; bool bj; int main() { cin>>a>>b; for(int i=1;i<=a;++i) { cin>>l[i]; q[i]=q[i-1]+l[i]; l[i]*=i; } for(int i=1;i<=a;++i) { for(int j=i+1;j<=a;++j) if(l[i]==l[j]) { ans=(i+j)/2; bj=1; break; } if(bj) break; } if(b==0) tot=q[ans]; else tot=q[a]-q[ans-1]; cout<<ans<<" "<<tot; return 0; }
-
22017-05-30 20:41:52@
此题有剧毒。。真的莫名其妙的。。。夹的楼层直接整除2就行了???(我不会说我一开始都没想到中间的楼层可以夹很多层的(笑)然后又是内层for循环要从i+1开始(我靠,都什么鬼,以及发现这题都是pascal写的就贴一个c的版本
#include<iostream> using namespace std; int num[1005]; int main(void) { int n,m; cin>>n>>m; for(int i=1;i<=n;i++) { cin>>num[i]; } int floor=0,sum=0; for(int i=1;i<=n-2;i++) { for(int j=i+1;j<=n;j++) { if(num[i]*i==num[j]*j) { floor=(i+j)/2; } } } switch(m) { case 1: { for(int i=n;i>=floor;i--) { sum+=num[i]; } } break; case 0: { for(int i=1;i<=floor;i++) { sum+=num[i]; } } } cout<<floor<<' '<<sum<<endl; }
-
12021-03-19 16:53:51@
此題有劇毒,夾的樓層直接除2就可以了?
#include <cmath> #include <cstdio> #include <cstdlib> #include <cstring> #include <algorithm> #include <vector> #include <deque> using namespace std; namespace dts { int n,b,a[1<<10]; void main() { scanf("%d%d",&n,&b); for (int i=0;i<n;i++) scanf("%d",&a[i]); int pos=-2,ans=0; for (int i=0;i<n-2;i++) for (int j=i+1;j<n;j++) if (a[i]*(i+1)==a[j]*(j+1)) { pos=(i+j)>>1; goto code_end_find_pos; } code_end_find_pos: if (b==0) for (int i=0;i<=pos;i++) ans+=a[i]; else if (b==1) for (int i=n-1;i>=pos;i--) ans+=a[i]; printf("%d %d\n",pos+1,ans); } }; int main() { dts::main(); }
-
12018-11-01 21:01:10@
//其实这道题的数据范围可以给到10^5的 //设两层层数为x1,x2,警务数y1,y2 //成反比的条件为x1/y2==x2/y1 //一变形就成了x1*y1==x2*y2 //因为题目保证了只有一组解,我们可以以楼层数*警卫数为关键字进行排序,这样可以很快找出符合条件的两层楼 //结构体排序就可以~ #include<iostream> #include<algorithm> using namespace std; struct node{ int x,y,z; }q[1010]; int cmp(const node&a,const node&b) { return a.z<b.z; } int sum[1010]; int main() { int n,m,i,ans; cin>>n>>m; for(i=1;i<=n;i++) { cin>>q[i].x; q[i].y=i; q[i].z=i*q[i].x; sum[i]=sum[i-1]+q[i].x; } sort(q+1,q+n+1,cmp); for(i=2;i<=n;i++) if(q[i].z==q[i-1].z) { ans=(q[i].y+q[i-1].y)/2; break; } cout<<ans<<" "; if(m) cout<<sum[n]-sum[ans-1]; else cout<<sum[ans]; return 0; }
-
12018-03-30 11:31:16@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>int main()
{
int i,j,a,b,p=-1,ans=0;
scanf("%d %d",&a,&b);
int n[a+1];
for(i=1;i<=a;i++)
scanf("%d",&n[i]);
for(i=1;i<a;i++)
for(j=i+1;j<=a;j++)
{
double d1=n[j],d2=n[i],d3=i,d4=j;
if(d2*d3==d1*d4)
{
p=(i+j)/2;
break;
// printf("i=%d j=%d\n",i,j);
}
if(p!=-1) break;
}
if(b==0)
for(i=1;i<=p;i++)
ans+=n[i];
if(b==1)
for(i=a;i>=p;i--)
ans+=n[i];
printf("%d %d",p,ans);
} -
12012-10-05 09:57:36@
判断的时候用警卫数*楼层,取中用DIV
最后一个点相邻的两层是反比例,坑死我了……
双重循环一定要+1,不要+2!
再说一点
双重循环的内循环最好用一个布尔变量find控制,以空间换时间
if not find then for 。。。。。。else begin find:=true;break;end;
否则找到答案后外循环没有跳出会继续进行,很耗时间 -
12012-09-30 11:40:52@
数据范围在1000层楼以内吧……很多人都是1000过了。
警卫人数可以为0,所以不要多此一举去检查分数相等什么的,警卫数×楼层数就OK了 -
02017-11-16 21:11:16@
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #define eps 10e-6 #define FOR(i,x,y) for(i=x;i<=y;++i) using namespace std; int a[1000+100]; int tt[1000+100]; int gcd(int x,int y) { int t; for(;x%y!=0;) { t =x%y; x = y; y = t; } return y; } int main() { int n,b,i,j; cin>>n>>b; FOR(i,1,n) cin>>a[i]; int f ; FOR(i,1,n) FOR(j,i+1,n) { if(a[i]*i==a[j]*j) { f =(i+j)/2; } } int ans1 = 0; if(b==0) { FOR(j,1,f) ans1+=a[j]; } else { FOR(j,f,n) ans1+=a[j]; } cout<<f<<" "<<ans1<<endl;; }
-
02017-11-06 21:19:38@
毫无意义的水题。。题意不明,数据范围不明确,祸害啊!!
#include<cstdio>
#include<cstring>
#include<queue>
#include<bitset>
#include<cmath>
#include<algorithm>
using namespace std;
template<class T> inline void read(T &_a){
bool f=0;int _ch=getchar();_a=0;
while(_ch<'0' || _ch>'9'){if(_ch=='-')f=1;_ch=getchar();}
while(_ch>='0' && _ch<='9'){_a=(_a<<1)+(_a<<3)+_ch-'0';_ch=getchar();}
if(f)_a=-_a;
}int n,b,loc[1000001],f,cnt,a[1001];
int main()
{
read(n); read(b);
for (register int i=1;i<=n;++i) read(a[i]);
for (register int i=1;i<=n;++i)
if(loc[i*a[i]]) {f=(i+loc[i*a[i]])>>1; break;}
else loc[i*a[i]]=i;
if(b) for (register int i=n;i>=f;--i) cnt+=a[i];
else for (register int i=1;i<=f;++i) cnt+=a[i];
printf("%d %d",f,cnt);
return 0;
} -
02015-08-03 20:56:16@
program a1380;
var
i,j,k,l,n,m,ii,jj,kk:longint; ll:longint;
a,b:array[0..1000]of longint;
bb:boolean;
begin
readln(n,m);
for i:=1 to n do
readln(a[i]);
ii:=0; jj:=0;
for i:=1 to n-1 do
begin
for j:=i+1 to n do
if (a[i]*i=a[j]*j) then
begin
ii:=i;
jj:=j;
kk:=(ii+jj)div 2;
if m=1 then
begin
for k:=n downto kk do
ll:=ll+a[k];
end
else
begin
for k:=1 to kk do
ll:=ll+a[k];
end;
writeln(kk,' ',ll);
halt;
end;
end;
end. -
02012-11-08 21:47:07@
交了5次...
一看很简单,就做了,60分
一看题解才知道,别人都是 for i:=1 to n-1 do ,我是 for i:=1 to n-2 do
不知为啥,一改就过了...
代码:
program P1380;
label 1;
var
a:array[1..10000] of integer;
n,i,j,b,m,k:integer;
begin
readln(n,b);
for i:=1 to n do
readln(a[i]);
for i:=1 to n-1 do
for j:=i+1 to n do
if (i*a[i]=j*a[j]) then begin write((i+j) div 2);m:=(i+j) div 2; goto 1; end;
1:if b=0 then begin for i:=1 to m do k:=k+a[i]; end
else begin for i:=n downto m do k:=k+a[i]; end;
write(' ',k);
end. -
02010-07-24 20:30:02@
这题表述极其不清楚,害我Wa了3次~浪费我AC率。
Program P1380;
var n,su,i,j,k,sum,hit:longint;
s:array[1..100000] of longint;
begin
readln(n,su);
for i:=1 to n do readln(s[i]);
for i:=1 to n-1 do
for j:=i+1 to n do
if s[i]*i=s[j]*j then begin
hit:=(i+j) div 2;
write(hit,' ');sum:=0;
if su=0 then
for k:=1 to hit do inc(sum,s[k])
else for k:=hit to n do inc(sum,s[k]);
writeln(sum);
end;
end. -
02010-04-09 21:36:54@
水的很!!! 我都AC了。。。
var
a,b:array[1..10000] of integer;
m,n,i,j,k,q,w:longint;
begin
readln(m,n);
for i:=1 to m do
begin
readln(a[i]);
b[i]:=a[i]*i;
end;
for i:=1 to m-1 do
for j:=i+1 to m do
if b[i]=b[j] then begin
k:=(i+j) div 2;
if n=1 then begin
for q:=m downto k do
w:=w+a[q];
write(k,' ',w);
exit;
end
else begin
for q:=1 to k do
w:=w+a[q];
write(k,' ',w);
exit;
end;
end;
end. -
02009-11-07 09:36:44@
编译通过...
├ 测试数据 01:答案正确... 0ms
├ 测试数据 02:答案正确... 0ms
├ 测试数据 03:答案正确... 0ms
├ 测试数据 04:答案正确... 0ms
├ 测试数据 05:答案正确... 0ms
---|---|---|---|---|---|---|---|-
Accepted 有效得分:100 有效耗时:0ms
___|\__|\__|\__|\__|\__|\__|\__|\__|\__|\__|\__|\__|_
此题没有任何意义,且表述不清,建议管理员删除。 -
02009-11-03 10:51:21@
可以夹多层...
i*楼层[i]==j*楼层[j];
楼层=(i+j)/2; -
02009-10-30 16:34:10@
var a,b,i,j,k,sum:longint;
c:array[1..10000] of longint;
begin
readln(a,b); sum:=0; k:=0;
for i:=1 to a do read(c[i]);
for i:=1 to a-1 do
for j:=i+1 to a do
if i*c[i]=j*c[j] then begin k:=(i+j) div 2; break; end;
if b=1 then for i:=a downto k do inc(sum,c[i])
else if b=0 then for i:=1 to k do inc(sum,c[i]);
writeln(k,' ',sum);
end.终于AC了,恭喜本人AC第68道题!
-
02009-10-29 13:39:47@
var
c:array [1..1000] of integer;
j,i,a,b,s,t:longint;
begin
readln(a,b);
for i:=1 to a do read(c[i]);
for i:=1 to a-1 do
for j:=i+1 to a do
if (i*c[i]=j*c[j]) then t:=(i+j)div 2;
j:=t;s:=0;
if b=0 then for i:=1 to j do s:=s+c[i];
if b=1 then for i:=a downto j do s:=s+c[i];
writeln(j,' ',s);
end.
终于AC了,恭喜本人AC第40道题! -
02009-10-15 20:14:15@
麻烦出题人写写范围吧
-
02009-10-11 09:22:53@
相当水 一次ac
-
02009-10-06 19:50:20@
不是巴 这样也行啊
出题认识不是傻子阿
害我提交了3次阿
原来中间不是一层的阿
那if i*a[j]=j*a[i] then 层=(i+j)div 2