poj 2356 (抽屉原理)
题目链接:http://poj.org/problem?id=2356
题目大意:给你n个数,要你从n个数选出若干个数,要求这若干个数的和是n的倍数,输出选择数的个数,以及相应的数。
解题思路:
以下摘自博客:https://www.cnblogs.com/pengwill/p/7367031.html
二、鸽巢原理(抽屉原理)
基本描述
桌子上有是个苹果,把这十个苹果放到九个抽屉里,无论怎么放,我们会发现至少会有一个抽屉里面至少放两个苹果。这一现象就是所说的“抽屉原理”。
更一般的表述:如果每一个抽屉代表一个集合,每一个苹果就可以代表一个元素。加入有n+1个元素放到n个集合中去,其中必定有一个集合里至少有两个元素。
第一抽屉原理
原理1
把多余n+1个物体放到n个抽屉里,则至少有一个抽屉里的东西不少于两件。
原理2
把多余mn+1(n不为0)个物体放到n个抽屉里面,则至少有一个抽屉里面不少于(m+1)的物体。
第二抽屉原理
把(mn -1 )个物体放入n个抽屉中,其中必须有一个抽屉不多余(m-1)个物体。
如将3*5-1 = 14个物体放入5个抽屉中,则必定有一个抽屉中的物体数目少于3-1=2.
举例
属相问题
属相有12个,那么任意37个人中,至少有几个人属相相同?
上取整(37 / 12) = 4
招聘问题
有300人到招聘会求职,其中软件设计有100人,市场营销有80人,财务管理有70人,人力资源管理有50人。那么至少有多少人找到工作才能保证一定有70人找的工作专业相同?
考虑最差情况,即软件设计,市场营销,财务管理均招了69人,人力资源管理招了50人,此时再多招1人,就有70人找的工作专业相同了。
故答案为 69*3 + 50 + 1 = 258
衬衫问题
一个抽屉里有20件衬衫,其中4件是蓝的,7件是灰的,9件是红的,则应从中随意取出多少件才能保证有5件是同颜色的?
考虑最差情况,即已经取出了4件蓝色,4件灰色,4件红色,再多取出1件就满足条件。
故答案为 4 + 4 + 4 + 1 = 13
首先我们可以分别求出这n个数的前缀和,sum[1],sum[2],……,sum[n];如果当中有n的倍数,则直接输出就好了。
否则sum[1]%n,sum[2]%n,……,sum[n]%n,这n个数必定在区间[1,n-1]之间,这就相当于有n个物品和n-1个抽屉,根据第一抽屉原理可得,必定存在i,j,假设i<j,使得sum[i]%n=sum[j]%n,则(sum[j]-sum[i])%n=0。输出答案只要出j-i,和a[i+1],a[i+2]……a[j]就可以了。
代码:
#include<iostream>
using namespace std;
typedef long long ll;
ll n,a[],sum[],pos[];
//pos[i]记录sum[i]%n是否出现过,如果以出现,则标记为出现的初始位置
int main(){
cin>>n;
for(int i=;i<=n;i++){
cin>>a[i];
sum[i]=sum[i-]+a[i];
}
for(int i=;i<=n;i++){
if(sum[i]%n==){
cout<<i<<endl;
for(int j=;j<=i;j++)cout<<a[j]<<endl;
break;
}
if(pos[sum[i]%n]){
cout<<i-pos[sum[i]%n]<<endl;
for(int j=pos[sum[i]%n]+;j<=i;j++)cout<<a[j]<<endl;
break;
}
pos[sum[i]%n]=i;
}
return ;
}
poj 2356 (抽屉原理)的更多相关文章
- poj 2356 抽屉原理
基本原理: n+1个鸽子放到n个笼子里,至少有一个笼子里有两只及其以上的鸽子.若有n个笼子,kn+1个鸽子,至少有一个笼子里面有k+1个鸽子: 题意:给定N个数,挑出一些数,他们和和是n的整数倍: 分 ...
- poj 2356鸽笼原理水题
关于鸽笼原理的知识看我写的另一篇博客 http://blog.csdn.net/u011026968/article/details/11564841 (需要说明的是,我写的代码在有答案时就输出结果了 ...
- POJ 2356 Find a multiple 抽屉原理
从POJ 2356来体会抽屉原理的妙用= =! 题意: 给你一个n,然后给你n个数,让你输出一个数或者多个数,让这些数的和能够组成n: 先输出一个数,代表有多少个数的和,然后再输出这些数: 题解: 首 ...
- POJ 2356. Find a multiple 抽屉原理 / 鸽巢原理
Find a multiple Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 7192 Accepted: 3138 ...
- Find a multiple POJ - 2356 (抽屉原理)
抽屉原理: 形式一:设把n+1个元素划分至n个集合中(A1,A2,…,An),用a1,a2,…,an分别表示这n个集合对应包含的元素个数,则:至少存在某个集合Ai,其包含元素个数值ai大于或等于2. ...
- POJ 2356 && POJ 3370 鸽巢原理
POJ 2356: 题目大意: 给定n个数,希望在这n个数中找到一些数的和是n的倍数,输出任意一种数的序列,找不到则输出0 这里首先要确定这道题的解是必然存在的 利用一个 sum[i]保存前 i 个数 ...
- POJ 3370 Halloween treats(抽屉原理)
Halloween treats Every year there is the same problem at Halloween: Each neighbour is only willing t ...
- POJ 3370 Halloween treats(抽屉原理)
Halloween treats Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 6631 Accepted: 2448 ...
- Find a multiple POJ - 2356 【鸽巢原理应用】
Problem DescriptionThe input contains N natural (i.e. positive integer) numbers ( N <= 10000 ). E ...
随机推荐
- oracle小记:dba_data_files
今天给表空间扩展的时候,使用了dba_data_files进行查询.查阅了网上的资料. 该系统系统中含有以下字段 每个字段的含义如下:
- 关于JS动画和CSS3动画的性能差异
本文章为综合其它资料所得. 根据Google Developer,Chromium项目里,渲染线程分为main thread和compositor thread. 如果CSS动画只是改变transfo ...
- Python--文件、文件夹、压缩包、处理模块shutil
高级的 文件.文件夹.压缩包 处理模块 shutil.copyfileobj(fsrc, fdst[, length])将文件内容拷贝到另一个文件中 1 import shutil 2 3 shuti ...
- 重写TreeView模板来实现数据分层展示(一)
总想花些时间来好好总结一下TreeView这个WPF控件,今天来通过下面的这几个例子来好好总结一下这个控件,首先来看看一个常规的带虚线的TreeView控件吧,在介绍具体如何完成之前首先来看看最终实现 ...
- 莫烦sklearn学习自修第七天【交叉验证】
1. 什么是交叉验证 所谓交叉验证指的是将样本分为两组,一组为训练样本,一组为测试样本:对于哪些数据分为训练样本,哪些数据分为测试样本,进行多次拆分,每次将整个样本进行不同的拆分,对这些不同的拆分每个 ...
- wget 下载网页
如有转载,不胜荣幸.http://www.cnblogs.com/aaron-agu/ wget --http-user=username --http-passwd=password http:/w ...
- 创建简单的表单Demo
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- easyui datagrid动态修改editor时动态绑定combobox的数据
需求在 datagrid 编辑框中开启一个combobox ,但是里面的数据需要开启的时候才会知道,数据会根据其他因数变更 参考原文 :http://blog.csdn.net/donggua369 ...
- 转 freemarker macro(宏)的使用
有人说用freemarker,但没有用到它的宏(macro),就=没有真正用过freemarker.说的就是宏是freemarker的一大特色. 宏的定义可以查看相关的文档,里面介绍得很清楚,下面来看 ...
- Spring Boot 构建电商基础秒杀项目 (九) 商品列表 & 详情
SpringBoot构建电商基础秒杀项目 学习笔记 ItemDOMapper.xml 添加 <select id="listItem" resultMap="Bas ...