NYOJ世界末日【抽屉原理】

世界末日

时间限制: 1000 ms  |  内存限制: 65535 KB
难度: 1
描述
世界末日马上就要来临了,当然,每个人都想买到船票,但是由于船票有限,因此需要回答对一个问题才能买票。问题是这样的:给你一个数n (1 <= n <= 10000),之后给n个正整数 (<= 10000),问在这n个数中是否存在一些数的和是n的倍数。
输入
多组测试数据(最多100组)。首先输入一个数n,然后输入n个数。
输出
如果能找到一些数的和是n的倍数,输出"YES",否则输出"NO"。
样例输入
5
5 3 6 7 9
样例输出
YES
抽屉原理。

sum[0]=0;

sum[i]=(a[1]+a[2]+a[3]...a[i])%n;

如果存在i>0 使得sum[i]=0;则直接输出a[1],a[2],,....a[i]即可满足题意。

如果不存在,考虑sum[ j ]-sum[ i ]=a [ i+1 ],a[ i+2 ]....a[ j ]。

即如果存在sum[ j ]-sum[ i ]==0,则输出 a [ i+1 ],a[ i+2 ]....a[ j ] 即可。

接下来用抽屉原理证明 i , j 必然存在。
抽屉原理:
如果将大于n个数量的物品放入n个抽屉,则必然存在某个抽屉放了大于1个物品。
因为sum [ i ] 的值只能是1,....n-1.sum [ i ]的数量有n个。

所以由抽屉原理可知,必然存在某两个sum [ i ] 值一样。
#include<cstdio>
#include<cstdlib>
#include<cstring>
using namespace std;
char s[50000];
int main()
{
	int n;
	while(scanf("%d",&n)==1){
		getchar();gets(s);
		printf("YES\n");
	}
	return 0;
}        
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值