poj2356 抽屉原理

来源:互联网 发布:平方c语言 编辑:程序博客网 时间:2024/05/18 13:31

题目链接

题意:给你n个不大于15000的自然数,其中有些数可能相同,让你在其中选择一些数让他们的总和是n的倍数,若存在,输出选择数的个数和这些数,不存在则输出0

n<=10000;

设n个数分别为a1,a2...an,前缀和分别为s1,s2...sn,让前缀和对n取模,则有n个取模后的数,这些数一定在0~n-1之间,由抽屉原理,这些数中一定有两个数相同,故答案即为这两个前缀之间的数,所以不存在输出0的情况

#include<cstdio>#include<algorithm>#include<iostream>using namespace std;int main(){int n;cin>>n;    int s,e;        int rem[10005]={0},z[10005]={0},a[10005];    for(int i=1;i<=n;i++)         scanf("%d",&a[i]);     for(int i=1;i<=n;i++){        z[i]=z[i-1]+a[i];        z[i]=z[i]%n;        if(z[i]==0){            s=1;            e=i;            break;        }         else if(rem[z[i]]){            s=rem[z[i]]+1;            e=i;            break;         }         else rem[z[i]]=i;        }        printf("%d\n",e-s+1);        for(int i=s;i<=e;i++)            printf("%d\n",a[i]);}


0 0
原创粉丝点击