链接:点击打开链接
题意:给定n个数,求其中的一个集合中每个元素的值加和正好是n的倍数的集合中的元素是什么(如果有多个输出任何一个)
代码:
#include <map>
#include <set>
#include <stack>
#include <queue>
#include <string>
#include <math.h>
#include <vector>
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <string.h>
#include <algorithm>
using namespace std;
const int siz=10005;
struct node{
int id,sum;
friend bool operator<(node a,node b){
if(a.sum==b.sum)
return a.id<b.id;
return a.sum<b.sum;
}
}S[siz];
int a[siz];
int main(){
int i,j,u,n;
while(scanf("%d",&n)!=EOF){ //我们可以算出余数的前缀和,根据抽屉原理
S[0].sum=0; //可得必然有一个前缀和等于0或者两个前缀和相等
for(i=1;i<=n;i++){
scanf("%d",&a[i]);
S[i].sum=(S[i-1].sum+a[i])%n;
S[i].id=i;
}
sort(S+1,S+n+1);
if(S[1].sum==0){
printf("%d\n",S[1].id);
for(i=1;i<=S[1].id;i++)
printf("%d\n",a[i]);
continue;
}
for(i=1;i<n;i++){
if(S[i].sum==S[i+1].sum){
printf("%d\n",S[i+1].id-S[i].id);
for(j=S[i].id+1;j<=S[i+1].id;j++)
printf("%d\n",a[j]);
}
}
}
return 0;
}