1. 程式人生 > >poj Find a multiple【鴿巢原理】

poj Find a multiple【鴿巢原理】

一個 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【鴿巢原理】