70 条题解

  • 2
    @ 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;   
    }
    
  • 1
    @ 2018-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;
    }
    
  • 1
    @ 2018-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);
    }

  • 1
    @ 2017-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;
    } 
    
  • 1
    @ 2012-10-05 09:57:36

    判断的时候用警卫数*楼层,取中用DIV

    最后一个点相邻的两层是反比例,坑死我了……

    双重循环一定要+1,不要+2!

    再说一点

    双重循环的内循环最好用一个布尔变量find控制,以空间换时间

    if not find then for 。。。。。。else begin find:=true;break;end;

    否则找到答案后外循环没有跳出会继续进行,很耗时间

  • 1
    @ 2012-09-30 11:40:52

    数据范围在1000层楼以内吧……很多人都是1000过了。

    警卫人数可以为0,所以不要多此一举去检查分数相等什么的,警卫数×楼层数就OK了

  • 0
    @ 2017-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;;
    }
    
    
  • 0
    @ 2017-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;
    }

  • 0
    @ 2015-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.

  • 0
    @ 2012-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.

  • 0
    @ 2010-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.

  • 0
    @ 2010-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.

  • 0
    @ 2009-11-07 09:36:44

    编译通过...

    ├ 测试数据 01:答案正确... 0ms

    ├ 测试数据 02:答案正确... 0ms

    ├ 测试数据 03:答案正确... 0ms

    ├ 测试数据 04:答案正确... 0ms

    ├ 测试数据 05:答案正确... 0ms

    ---|---|---|---|---|---|---|---|-

    Accepted 有效得分:100 有效耗时:0ms

    ___|\__|\__|\__|\__|\__|\__|\__|\__|\__|\__|\__|\__|_

    此题没有任何意义,且表述不清,建议管理员删除。

  • 0
    @ 2009-11-03 10:51:21

    可以夹多层...

    i*楼层[i]==j*楼层[j];

    楼层=(i+j)/2;

  • 0
    @ 2009-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道题!

  • 0
    @ 2009-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道题!

  • 0
    @ 2009-10-15 20:14:15

    麻烦出题人写写范围吧

  • 0
    @ 2009-10-11 09:22:53

    相当水 一次ac

  • 0
    @ 2009-10-06 19:50:20

    不是巴 这样也行啊

    出题认识不是傻子阿

    害我提交了3次阿

    原来中间不是一层的阿

    那if i*a[j]=j*a[i] then 层=(i+j)div 2

  • 0
    @ 2009-10-01 23:50:33

    这道题劝大家不要做,完全是脑残出的题目。我编的正解居然不能过,还要用脑残的解法,符合要求的层居然可能是相邻的或是中间夹偶数层的。简直浪费人感情!!!

信息

ID
1380
难度
4
分类
模拟 点击显示
标签
递交数
1316
已通过
568
通过率
43%
上传者