71 条题解

  • 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;   
    }
    
  • 2
    @ 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
    @ 2021-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();
    }
    
  • 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
    @ 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

信息

ID
1380
难度
4
分类
模拟 点击显示
标签
递交数
1338
已通过
579
通过率
43%
被复制
3
上传者