您的位置:首页 > 其它

鸽巢原理 ..POJ 2356 & 3370

2013-08-07 15:41 337 查看
原理简单..N+1个物品放入N个盒子中..必定有一个盒子里物品大于一个...

但要知道什么时候用...1、may print any of them ..Special judge...就像这两题..如果要输出数最少的..估计DP了.

2、有类似取模的运算...



Program ( POJ 2356 )

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<cmath>
#include<queue>
#include<stack>
#include<set>
#include<map>
#include<algorithm>
#define ll long long
#define eps 1e-5
#define oo 10007
#define pi acos(-1.0)
#define MAXN 10005
using namespace std;
int sum[MAXN],a[MAXN],times[MAXN]; 
int main()
{         
       int i,j,x,n;      
       sum[0]=0;
       memset(times,0,sizeof(times));
       scanf("%d",&n);
       for (i=1;i<=n;i++)
       { 
              scanf("%d",&a[i]);
              sum[i]=(sum[i-1]+a[i])%n;
              times[sum[i]]++;
       }
       if (times[0])
       {
              for (i=1;i<=n;i++)
                 if (sum[i]==0) break;
              printf("%d\n",i);
              for (x=1;x<=i;x++) printf("%d\n",a[x]);
       }else
       {
              for (x=1;x<n;x++)
                 if (times[x]>=2) break;
              for (i=1;i<=n;i++)
                 if (sum[i]==x) break;
              for (j=i+1;j<=n;j++)
                 if (sum[j]==x) break;
              printf("%d\n",j-i);
              for (x=i+1;x<=j;x++) printf("%d\n",a[x]);
       }
       return 0;
}


Program ( POJ 3370 )

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<cmath>
#include<queue>
#include<stack>
#include<set>
#include<map>
#include<algorithm>
#define ll long long
#define eps 1e-5
#define oo 10007
#define pi acos(-1.0)
#define MAXN 100005
using namespace std;
int sum[MAXN],a[MAXN],times[MAXN]; 
int main()
{         
       int i,j,x,c,n;   
       while (~scanf("%d%d",&c,&n) && n && c)
       {
              sum[0]=0;
              memset(times,0,sizeof(times));
              for (i=1;i<=n;i++)
              { 
                   scanf("%d",&a[i]);
                   sum[i]=(sum[i-1]+a[i])%c;
                   times[sum[i]]++;
              }
              if (times[0])
              {
                   for (i=1;i<=n;i++)
                       if (sum[i]==0) break; 
                   for (x=1;x<i;x++) printf("%d ",x);
                   printf("%d",i);
              }else
              {
                    for (x=1;x<c;x++)
                       if (times[x]>=2) break;
                    for (i=1;i<=n;i++)
                       if (sum[i]==x) break;
                    for (j=i+1;j<=n;j++)
                       if (sum[j]==x) break; 
                    for (x=i+1;x<j;x++) printf("%d ",x);
                    printf("%d",j);
              }
              printf("\n");
       }
       return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: