读书人

Team Mate 屉子原理

发布时间: 2012-09-01 09:33:03 作者: rapoo

Team Mate 抽屉原理

/*题意就是给你n个人,从中选出m个人,使其总和为n的倍数。这个题为明显的抽屉原理。首先,预处理一个数组s记录前i项和,i:1-n。若前i项和中有一项能被n整数,则符合题意输出一种方案。否则,n个s[i]中必定至多有n-1中余数,即至少两个Si同余。则将他们找出,输出两个下标中间的项即为符合题意的方案。*/#include <stdio.h>#include <cstring>int s[10001];int a[10001];int m[10001];bool v[10001];int main(){    int n;    while(scanf("%d",&n)==1)    {        memset(s,0,sizeof(s));        memset(m,0,sizeof(m));        memset(v,false,sizeof(v));        bool ret=false;        for(int i=1; i<=n; i++)        {            scanf("%d",&a[i]);            s[i]=s[i-1]+a[i];            s[i]=s[i]%n;        }        for(int i=1; i<=n; i++)        {            if(s[i]==0)            {                ret=true;                printf("%d\n",i);                for(int j=1; j<i; j++)                    printf("%d ",a[j]);                printf("%d\n",a[i]);                break;            }        }        if(ret) continue;        int e=0;        for(int i=1; i<=n; i++)        {            if(!v[s[i]])            {                v[s[i]]=true;                m[s[i]]=i;//用来记录余数相同的第一个下标            }            else            {                e=i;//余数相同的第二个下标                break;            }        }        printf("%d\n",e-m[s[e]]);        for(int i=m[s[e]]+1; i<e; i++)            printf("%d ",a[i]);        printf("%d\n",a[e]);    }    return 0;}


读书人网 >编程

热点推荐