poj Find a multiple【鴿巢原理】
阿新 • • 發佈:2018-07-01
一個 while tps int www. span space ML .html
參考:https://www.cnblogs.com/ACShiryu/archive/2011/08/09/poj2356.html
鴿巢原理???
其實不用map但是習慣了就打的map
以下C-c自參考博客:
我們可以依次求出a[0],a[0]+a[1],a[0]+a[1]+a[2],......,a[0]+a[1]+a[2]...+a[n];
假設分別是sum[0],sum[1],sum[2],......,sum[n]
如果在某一項存在是N的倍數,則很好解,即可直接從第一項開始直接輸出答案
但如果不存在,則sum[i]%N的值必定在[1,N-1]之間,又由於有n項sum,有抽屜原理:
把多於n個的物體放到n個抽屜裏,則至少有一個抽屜裏有2個或2個以上的物體。
則必定有一對i,j,使得sum[i]=sum[j]
所以用map記一下余數的出現位置,然後直接在map裏找即可
#include<iostream>
#include<cstdio>
#include<map>
using namespace std;
const int N=10005;
int n,a[N],s[N];
map<int,int>mp;
int main()
{
while(~scanf("%d",&n))
{
mp.clear();
for(int i=1;i<=n;i++)
scanf("%d" ,&a[i]),s[i]=s[i-1]+a[i];
for(int i=1;i<=n;i++)
if(s[i]%n==0)
{
printf("%d\n",i);
for(int j=1;j<=i;j++)
printf("%d\n",a[j]);
return 0;
}
for(int i=1;i<=n;i++)
{
if (mp[s[i]%n])
{
printf("%d\n",i-mp[s[i]%n]);
for(int j=mp[s[i]%n]+1;j<=i;j++)
printf("%d\n",a[j]);
return 0;
}
mp[s[i]%n]=i;
}
}
return 0;
}
poj Find a multiple【鴿巢原理】