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;}