poj2356

来源:互联网 发布:肯德基收银软件 编辑:程序博客网 时间:2024/05/04 17:18

链接:点击打开链接

题意:给定n个数,求其中的一个集合中每个元素的值加和正好是n的倍数的集合中的元素是什么(如果有多个输出任何一个)

代码:

#include <iostream>#include <algorithm>using namespace std;long long  a[10005];struct node{    long long num,sum;}b[10005];int cmp(struct node a,struct node b){    if(a.sum==b.sum)    return a.num<b.num;    return a.sum<b.sum;}int main(){    long long n,i,j,sumsum;    while(cin>>n){        sumsum=0;        for(i=0;i<n;i++){            cin>>a[i];            sumsum+=a[i];           //容斥原理,如果有n个数对n取余,最少有一个数模n=0,            b[i].sum=sumsum%n;      //或者两个数模n相等。因此前1,2,3...n个数的和正好是n个数            b[i].num=i;             //不是题目没有说是连续和,而是连续和肯定是满足条件的一种        }                           //情况,所以将和的余数存起来,当其中有两个和的余数相等时        sort(b,b+n,cmp);            //中间部分一定是n的倍数//        for(i=0;i<n;i++)//        cout<<b[i].num<<" "<<b[i].sum<<endl;        if(b[0].sum==0){            //模是0直接输出            cout<<b[0].num+1<<endl;            for(i=0;i<=b[0].num;i++)            cout<<a[i]<<endl;            continue;        }        for(i=0;i<n;i++){            if(b[i].sum==b[i+1].sum){//排序之后余数想等的肯定相邻            cout<<b[i+1].num-b[i].num<<endl;            for(j=b[i].num+1;j<=b[i+1].num;j++)            cout<<a[j]<<endl;            break;        }        }    }    return 0;}


 

0 0
原创粉丝点击