HDU 5353

来源:互联网 发布:手机二次元壁纸软件 编辑:程序博客网 时间:2024/06/05 18:14
有n个人围成一圈,每个人有ai个糖果,每个人可以给相邻的人一个,问最后是否能使每个人都得到相等的糖果。
讨论三种情况
1 给 2 
2 给 1
1 ,2 不相互给,
接下来从 2 到 n-1  如果 a[i]>平均值则给下一个人一个,如果a[i]<平均值,则从下一个人得到一个,最后讨论 1和n的关系 

特判,当所有数都相等时    ;

#include<bits/stdc++.h>using namespace std;const int maxn = 100005;int a[maxn];int b[maxn];int c[maxn];int ans[maxn*2+10];int main(){    int T ;    scanf("%d", &T);    while(T--)    {        int n;        scanf("%d", &n );        long long  sum = 0;        int fl=0;        for(int i = 1; i <= n; i++)        {            scanf("%d",&a[i]);            if(i>1&&a[i]!=a[i-1])            {                fl=1;            }            b[i]=c[i]=a[i];            sum +=a[i];        }        if(a[n]!=a[1])        {            fl=1;        }        if(!fl)        {            printf("YES\n");            printf("0\n");            continue;        }        if(sum%n)        {            printf("NO\n");            continue;        }        int flag=0;        int ave = sum / n;        a[1]--;        a[2]++;        int k = 1;        ans[k++]=1;        ans[k++]=2;        for( int i = 2; i<= n-1; i++)        {            if(a[i]>ave)            {                a[i]--;                a[i+1]++;                ans[k++]=i;                ans[k++]=i+1;                if(a[i] != ave)                {                    flag=1;                    break;                }            }            else if(a[i] < ave)            {                a[i]++;                a[i+1]--;                if(a[i]!=ave)                {                    flag=1;                    break;                }                ans[k++]=i+1;                ans[k++]=i;            }        }        if(a[n]>a[1]&&!flag)        {            a[n]--;            a[1]++;            ans[k++]=n;            ans[k++]=1;        }        else if(a[n]<a[1])        {            a[n]++;            a[1]--;            ans[k++]=1;            ans[k++]=n;        }        if(a[n]!= ave|| a[1]!= ave )        {            flag=1;        }        if(!flag)        {            printf("YES\n");            printf("%d\n",k/2);            for(int i = 1; i < k; i+=2)            {                printf("%d %d\n",ans[i],ans[i+1]);            }            continue;        }        flag=0;        b[1]++;        b[2]--;        k=1;        ans[k++]=2;        ans[k++]=1;        for( int i = 2; i<= n-1; i++)        {            if(b[i]>ave)            {                b[i]--;                b[i+1]++;                ans[k++]=i;                ans[k++]=i+1;                if(b[i] != ave)                {                    flag=1;                    break;                }            }            else if(b[i] < ave)            {                b[i]++;                b[i+1]--;                if(b[i]!=ave)                {                    flag=1;                    break;                }                ans[k++]=i+1;                ans[k++]=i;            }        }        if(b[n]>b[1])        {            b[n]--;            b[1]++;            ans[k++]=n;            ans[k++]=1;        }        else if(b[n]<b[1])        {            b[n]++;            b[1]--;            ans[k++]=1;            ans[k++]=n;        }        if(b[n]!= ave|| b[1]!= ave )        {            flag=1;        }        if(!flag)        {            printf("YES\n");            printf("%d\n",k/2);            for(int i = 1; i < k; i+=2)            {                printf("%d %d\n",ans[i],ans[i+1]);            }            continue;        }        k=1;        flag=0;        for( int i = 2; i<= n-1; i++)        {            if(c[i]>ave)            {                c[i]--;                c[i+1]++;                ans[k++]=i;                ans[k++]=i+1;                if(c[i] != ave)                {                    flag=1;                    break;                }            }            else if(c[i] < ave)            {            c[i]++;                c[i+1]--;                if(c[i]!=ave)                {                    flag=1;                    break;                }                ans[k++]=i+1;                ans[k++]=i;            }        }        if(c[n]>c[1])        {            c[n]--;            c[1]++;            ans[k++]=n;            ans[k++]=1;        }        else if(c[n]<c[1])        {            c[n]++;            c[1]--;            ans[k++]=1;            ans[k++]=n;        }        if(c[n]!= ave|| c[1]!= ave )        {            flag=1;        }        if(!flag)        {            printf("YES\n");            printf("%d\n",k/2);            for(int i = 1; i < k; i+=2)            {                printf("%d %d\n",ans[i],ans[i+1]);            }            continue;        }        else        {            printf("NO\n");        }    }    return 0;}


0 0
原创粉丝点击