活不了

#include<cstdio>
#include<iostream>
using namespace std;
int main()
{
int n,a[105],sum=0,step=0;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
sum+=a[i];
}
sum/=n;
for(int i=1;i<=n;i++)
a[i]-=sum;
int l=1,r=n;
while(!a[l]&&l<n)l++;
while(!a[r]&&r>1)r--;
while(l<r)
{
a[l+1]+=a[l];
a[l]=0;
step++;
l++;
while(!a[l+1]&&l<r)l++;
}
printf("%d",step);
return 0;
}

2 条评论

  • @ 2016-06-23 21:51:15
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    #include<math.h>
    int main(void)
    {
        int n,a[100],sum=0,x,s,i;
        scanf("%d",&n);
        for (i=0;i<n;i++)
        {
            scanf("%d",&a[i]);
            sum+=a[i];
        }
        sum/=n;
        x=0;
        s=0;
        for (i=0;i<n;i++)
        {
            if ((a[i]+x)!=sum)
                s++;
            x+=a[i]-sum;
        }
        printf("%d",s);
    }
    

    想法非常简单。。问题是要能明白可以移动负数张牌(代表反方向移动)这样就容易多了,在a[i]+x=sum时不需要移动牌,次数不加1

  • @ 2016-06-23 21:51:13
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    #include<math.h>
    int main(void)
    {
        int n,a[100],sum=0,x,s,i;
        scanf("%d",&n);
        for (i=0;i<n;i++)
        {
            scanf("%d",&a[i]);
            sum+=a[i];
        }
        sum/=n;
        x=0;
        s=0;
        for (i=0;i<n;i++)
        {
            if ((a[i]+x)!=sum)
                s++;
            x+=a[i]-sum;
        }
        printf("%d",s);
    }
    

    想法非常简单。。问题是要能明白可以移动负数张牌(代表反方向移动)这样就容易多了,在a[i]+x=sum时不需要移动牌,次数不加1

  • 1

信息

ID
1123
难度
3
分类
贪心 点击显示
标签
递交数
8350
已通过
4222
通过率
51%
被复制
27
上传者