鸽巢原理 ..POJ 2356 & 3370

       原理简单..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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值