链接:传送门

题意:万圣节到了,有 c 个小朋友向 n 个住户要糖果,根据以往的经验,第i个住户会给他们a[ i ]颗糖果,但是为了和谐起见,小朋友们决定要来的糖果要能平分,所以他们只会选择一部分住户索要糖果,这样糖果恰好可以平分又不会剩下,输出索要糖果的用户编号。如果没有任何一组住户给的糖果总数能够平分,则输出 "no sweets" 。SPJ( 意味着答案不唯一 )

思路:

  • 简单鸽巢原理题目,可以将问题转化成

给出一个正整数序列A1,A2, ... ,An ,求有没有整数 l 和 r ( 1<= l < r <= n ) ,使得 Al + .... + Ar 是 C的倍数。

  • 题目已知 A[],构造序列 Si = A1 + A2 + A3 + ... + Ai ( 1 <= i <= n ),则有两种可能

    1. Si % C == 0
    2. 任意的 Si 都不是C的倍数 ,令 Ri ≡ Si mod C ( 1<= i <= n )

      既然所有的Si都不是C的倍数,那 Ri 的取值范围应该在[ 1 , C-1 ] 之间,现在有 n 个Ri 分布到 C-1 个位置上并且 n >= C ,所以在区间 [ 1 , C-1 ] 之间一定至少会有两个 R 的值是相等的,设这两个相同 R 值的 S 分别为 Sh 和 Sk ( k > h ),则 ( Sk - Sh ) mod C == 0,即 Ak+1 , Ak+2 , ... ,Ah 这段序列的和为 C 的倍数
  • 再来思考这道题,根据上面的分析,可以得知这道题是一定有解的...... 所以根本不需要输出一个 "no sweets"


<font color = blue , size = '4'>下面是做这道题的三个代码,很能体现出代码优化的重要性,希望以后在做完题之后能坚持优化自己的代码,不以A题为目的,共勉。

最后有福利 /滑稽

1.想用vector来存一下余数相同的 位置 i

/*************************************************************************
> File Name: poj3370.cpp
> Author: WArobot
> Blog: http://www.cnblogs.com/WArobot/
> Created Time: 2017年04月29日 星期六 15时06分01秒
************************************************************************/ #include<cstdio>
#include<vector>
using namespace std; #define maxn 100100 int c,n;
int a[maxn];
long long S[maxn];
vector<int> Rem[maxn]; // 定义一个余数的链表 int main(){
while(~scanf("%d%d",&c,&n) && (c||n)){
for(int i=0;i<maxn;i++) Rem[i].clear(); for(int i=1;i<=n;i++) scanf("%d",a+i); S[0] = 0;
int ok = 0 , e;
for(int i=1;i<=n;i++){
S[i] = a[i] + S[i-1] ;
if(S[i]%c == 0){
ok = 1; e = i;
break;
}
Rem[ S[i]%c ].push_back(i);
}
if(ok){
for(int i=1;i<e;i++)
printf("%d ",i);
printf("%d\n",e);
}
else{
for(int i=0;i<c;i++){
if(Rem[i].size()>=2){
ok = 1;
for(int j=Rem[i][0]+1;j<=Rem[i][1];j++)
printf("%d%c",j,j==Rem[i][1]?'\n':' ');
break;
}
}
if(!ok) printf("no sweets\n");
}
}
return 0;
}

2.用vis[]标记之前是否出现过余数,并且 S[ i ] = ( a[i] + S[i-1] ) 可以优化成S[ i ] = ( a[i] + S[i-1] )%c,使得数组S中只用来存放余数而不在存放 和,在计算余数的时候不会多次计算 S[i]%c 的值,缩减了一下时间。

/*************************************************************************
> File Name: poj3371t2.cpp
> Author: WArobot
> Blog: http://www.cnblogs.com/WArobot/
> Created Time: 2017年04月29日 星期六 16时12分38秒
************************************************************************/ #include<cstdio>
#include<iostream>
#include<cstring>
using namespace std; const int maxn = 100010;
int c,n;
int a[maxn] , vis[maxn];
long long sum[maxn]; void print(int a,int b){
for(int i=a;i<=b;i++)
printf("%d%c",i,i==b?'\n':' ');
return;
}
int main(){
while(~scanf("%d%d",&c,&n) && (c+n)){
memset(vis,0,sizeof(vis));
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
sum[0] = 0;
for(int i=1;i<=n;i++){
sum[i] = a[i]+sum[i-1];
if(sum[i]%c==0){
print(1,i);
break;
}
if(vis[sum[i]%c]){
print(vis[sum[i]%c]+1,i);
break;
}
vis[sum[i]%c] = i;
}
}
return 0;
}

3.后来发现数组 S[ ] 也是多浪费空间的,改成了一个整型 S,节省一下空间

 /*************************************************************************
> File Name: poj3371t2.cpp
> Author: WArobot
> Blog: http://www.cnblogs.com/WArobot/
> Created Time: 2017年04月29日 星期六 16时12分38秒
************************************************************************/ #include<cstdio>
#include<cstring>
using namespace std; const int maxn = 100010;
int c,n;
int a[maxn] , vis[maxn] , S; void print(int a,int b){
for(int i = a ; i < b ; i++)
printf("%d ", i);
printf("%d\n", b);
}
int main(){
while(~scanf("%d%d", &c, &n) && (c+n)){
memset(vis, 0, sizeof(vis));
for(int i = 1; i <= n; i++) scanf("%d",&a[i]);
S = 0;
for(int i = 1; i <= n; i++){
S = ( a[i] + S ) % c;
if ( S == 0 ){
print( 1 , i ); break;
}
if ( vis[ S ] ){
print( vis[ S ] + 1 , i ); break;
}
vis[ S ] = i;
}
}
return 0;
}

福利来了,博主在杭电上也发现了一道一模一样的题( HDU1808 ),并且还get到一个非常有趣的方法

#include<bits/stdc++.h>
using namespace std; int main(){
int c,n,x;
while(~scanf("%d%d",&c,&n) && c+n){
for(int i=0;i<n;i++) scanf("%d",&x);
printf("0\n");
}
return 0;
}

对,你没有看错! 竟然A了!!! 可见这道题杭电上的数据没POJ强 2333 ,这样做也是没问题的,小朋友们一块糖也不要不就行了吗?哈哈 有趣的小朋友!

POJ 3370 Halloween treats( 鸽巢原理简单题 )的更多相关文章

  1. POJ 3370 Halloween treats 鸽巢原理 解题

    Halloween treats 和POJ2356差点儿相同. 事实上这种数列能够有非常多,也能够有不连续的,只是利用鸽巢原理就是方便找到了连续的数列.并且有这种数列也必然能够找到. #include ...

  2. POJ 3370 Halloween treats(抽屉原理)

    Halloween treats Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 6631   Accepted: 2448 ...

  3. POJ 3370. Halloween treats 抽屉原理 / 鸽巢原理

    Halloween treats Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 7644   Accepted: 2798 ...

  4. [POJ 3370] Halloween treats

    Halloween treats Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 7143   Accepted: 2641 ...

  5. POJ 3370 Halloween treats(抽屉原理)

    Halloween treats Every year there is the same problem at Halloween: Each neighbour is only willing t ...

  6. HDU 5776 sum( 鸽巢定理简单题 )

    链接:传送门 题意:给一个长为 n 的串,问是否有子串的和是 m 的倍数. 思路:典型鸽巢定理的应用,但是这里 n,m 的大小关系是不确定的,如果 n >= m 根据定理可以很简单的判定是一定有 ...

  7. 鸽巢原理应用-分糖果 POJ 3370 Halloween treats

    基本原理:n+1只鸽子飞回n个鸽笼至少有一个鸽笼含有不少于2只的鸽子. 很简单,应用却也很多,很巧妙,看例题: Description Every year there is the same pro ...

  8. poj 3370 Halloween treats(鸽巢原理)

    Description Every year there is the same problem at Halloween: Each neighbour is only willing to giv ...

  9. POJ 2356 Find a multiple( 鸽巢定理简单题 )

    链接:传送门 题意:题意与3370类似 注意:注意输出就ok,输出的是集合的值不是集合下标 /***************************************************** ...

随机推荐

  1. 503是一种HTTP状态码。英文名503 Service Unavailable与404(404 Not Found)是同属一种网页状态出错码。前者是服务器出错的一种返回状态,后者是网页程序没有相关的结果后返回的一种状态,需要优化网站的时候通常需要制作404出错页以便网站整体优化。

    goldCat1 商城 消息 | 百度首页 新闻网页贴吧知道音乐图片视频地图百科文库 进入词条搜索词条帮助 近期有不法分子冒充官方收费编辑词条,百度百科严正声明:百科词条人人可编辑,词条创建和修改均免 ...

  2. js 操作table: insertRow(),deleteRow(),insertCell(),deleteCell()方法

    表格有几行: var trCnt = table.rows.length;  (table为Id ) 每行有几列:for (var i=0; i<trCnt; i++)              ...

  3. 关于linux三种网络形式

    今天是开始的第一天,额,没什么仪式.舍友偶然间提醒我,应该把学习的东西,做一下规划和整理.我想一想也是对的.所以开通了这个.希望以后回来可以看看自己曾经的幼稚,那证明了我不断在学习在进步.最近在准备C ...

  4. Oracle数据库性能优化基础

    1.数据处理分类OLTP,OLAP 2.Oracle特性 3.数据库优化方法论/原则 方法论:自顶向下优化和自底向上优化 3.1 自顶向下优化 3.2 自底向上优化 对于多年的老系统出现性能问题时,就 ...

  5. 《你又怎么了我错了行了吧》【Alpha】Scrum meeting 5

    第五天 日期:2019/6/18 前言: 第5次会议在女生宿舍召开 冲刺第5天,对所有工作做了总结.继续完善编码工作. 1.1 今日完成任务情况以及明天任务安排 姓名 当前阶段任务 下一阶段任务 刘 ...

  6. Exchange EMC打开出错 解决

    Exchange控制台打开出错如何解决 1.卸载win server功能中的winrm iis 2.重启 3.安装winrm iis 4.查看default web site 有没有绑定80端口,没有 ...

  7. Android慎用layout嵌套, 尽量控制在5层下面java.lang.StackOverflowError

    一.探寻原因 在一个复杂的layout嵌套较多layout的android界面.在Android 2.3.内存较低 的机型上,出现 java.lang.StackOverflowError 这个Exc ...

  8. (十进制高速幂+矩阵优化)BZOJ 3240 3240: [Noi2013]矩阵游戏

    题目链接: http://www.lydsy.com/JudgeOnline/problem.php?id=3240 3240: [Noi2013]矩阵游戏 Time Limit: 10 Sec  M ...

  9. nyoj Wythoff Game(暴力枚举)

    Wythoff Game  ms |   KB 描写叙述 近期ZKC同学在学博弈,学到了一个伟大的博弈问题--威佐夫博弈. 相信大家都学过了吧?没学过?没问题.我将要为你讲述一下这个伟大的博弈问题. ...

  10. 如何在IE浏览器里模仿DomContentLoaded

    稍微了解一点框架的事件绑定的都知道 window.onload 事件需要在页面所有内容(包括图片.flash.iframe等)加载完后,才执行,但往往我们更希望在 DOM 一加载完就执行脚本,而各大框 ...