POJ 2356 Find a multiple [抽屉原理]

原创 2012年03月22日 16:51:48

题意:

给定n个正数,请你从中找出若干个数,其和刚好是n的倍数。


思路:

抽屉原理。

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<iostream>
#include<vector>
#include<string>
#include<queue>
#include<cmath>
#include<algorithm>
#define llong long long
#define Min(a,b) (a<b?a:b)
#define Max(a,b) (a>b?a:b)
#define Abs(a) ((a)>0?(a):-(a))
#define Mod(a,b) (((a)-1+(b))%(b)+1)
using namespace std;
int n,m;
const int N=10005;
const int M=35;
const int inf=99999999;
int sum[N],a[N],has[N];
int main()
{
	scanf("%d",&n);
	memset(has,-1,sizeof(has));
	has[0]=0;
	int l,r;
	for(int i =1;i<=n;i++)
	{
		scanf("%d",a+i);
		sum[i]=(sum[i-1]+a[i])%n;
		if(has[sum[i]]==-1)
		{
			has[sum[i]]=i;
		}
		else
		{
			l=has[sum[i]];
			r=i;
		}
	}
	printf("%d\n",r-l);
	for(int i=l+1;i<=r;i++)
	{
		printf("%d\n",a[i]);
	}
	return 0;
}


poj 2356 暴力或者组合数学

Find a multiple Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6281  ...
  • bigsungod
  • bigsungod
  • 2014年11月24日 19:59
  • 807

poj 2356 鸽巢原理

Description The input contains N natural (i.e. positive integer) numbers ( N
  • winycg
  • winycg
  • 2016年04月19日 19:56
  • 148

poj2356

链接:点击打开链接 题意:给定n个数,求其中的一个集合中每个元素的值加和正好是n的倍数的集合中的元素是什么(如果有多个输出任何一个) 代码: #include #include using nam...
  • stay_accept
  • stay_accept
  • 2015年08月03日 18:30
  • 324

poj2356

Find a multiple Description The input contains N natural (i.e. positive integer) numbers ( N
  • lulining
  • lulining
  • 2012年07月08日 21:03
  • 327

poj 2356(鸽巢原理)

Description The input contains N natural (i.e. positive integer) numbers ( N
  • Feynman1999
  • Feynman1999
  • 2017年08月02日 11:46
  • 123

【POJ 2356】Find a multiple(抽屉原理-好题)

点击打开题目 Find a multiple Time Limit: 1000MS   Memory Limit: 65536K Total Su...
  • Manton_dong
  • Manton_dong
  • 2017年08月01日 09:14
  • 55

poj 2356 Find a multiple 抽屉原理

Find a multiple Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6263  ...
  • u012494557
  • u012494557
  • 2014年11月17日 16:08
  • 258

POJ 2356 鸽巢原理

鸽巢原理
  • neighthorn
  • neighthorn
  • 2016年07月28日 18:55
  • 220

鸽巢原理(入门) 之 poj 2356

//  [3/27/2014 Sjm] /* 鸽巢原理: 若 n+1 个物体被放进 n 个盒子, 那么至少有一个盒子包含两个或者更多的物体 解决 poj 2356: 问题简化:  有 n 个数字,a1...
  • u010438473
  • u010438473
  • 2014年03月29日 02:02
  • 607

抽屉原理简单应用 POJ 2356 POJ 3370

基本原理:k+1个物体放入k个盒子,一定至少有一个盒子有2个或更多的物体。 数学语言描述为:m(m>=1)个元素分成n个组,那么总有一个组至少含有元素个数为[ m/n ](向上取整)。 重要推论:设a...
  • AgoniAngel
  • AgoniAngel
  • 2016年07月19日 16:14
  • 183
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:POJ 2356 Find a multiple [抽屉原理]
举报原因:
原因补充:

(最多只允许输入30个字)