组合数学-抽屉原理
文章目录
- 抽屉原理
- 例题
- HDU-1205
- POJ-2356
抽屉原理
抽屉原理又称鸽巢原理:把 n+1个物品放进 n个盒子里,那么至少有一个盒子包含两个及以上的物品。
例题
HDU-1205
Problem Description HOHO,终于从Speakless手上赢走了所有的糖果,是Gardon吃糖果时有个特殊的癖好,就是不喜欢将一样的糖果放在一起吃,喜欢先吃一种,下一次吃另一种,这样;可是Gardon不知道是否存在一种吃糖果的顺序使得他能把所有糖果都吃完?请你写个程序帮忙计算一下。 Input 第一行有一个整数T,接下来T组数据,每组数据占2行,第一行是一个整数N(0<N<=1000000),第二行是N个数,表示N种糖果的数目Mi(0<Mi<=1000000)。 Output 对于每组数据,输出一行,包含一个"Yes"或者"No"。 Sample Input 2 3 4 1 1 5 5 4 3 2 1 Sample Output No Yes
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll t, n;
int main() {
cin >> t;
while (t--) {
ll mx, x, cnt = 0;
cin >> n >> mx;
cnt += mx;
for (int i = 1; i < n; i++) {
cin >> x;
mx = max(mx, x);
cnt += x;
}
if (cnt - mx < mx - 1) cout << "Non";
else cout << "Yesn";
}
return 0;
}
POJ-2356
Description The input contains N natural (i.e. positive integer) numbers ( N <= 10000 ). Each of that numbers is not greater than 15000. This numbers are not necessarily different (so it may happen that two or more of them will be equal). Your task is to choose a few of given numbers ( 1 <= few <= N ) so that the sum of chosen numbers is multiple for N (i.e. N * k = (sum of chosen numbers) for some natural number k). Input The first line of the input contains the single number N. Each of next N lines contains one number from the given set. Output In case your program decides that the target set of numbers can not be found it should print to the output the single number 0. Otherwise it should print the number of the chosen numbers in the first line followed by the chosen numbers themselves (on a separate line each) in arbitrary order. If there are more than one set of numbers with required properties you should print to the output only one (preferably your favorite) of them. Sample Input 5 1 2 3 4 1 Sample Output 2 2 3
#include<iostream>
#include<cstring>
using namespace std;
const int maxn = 100005;
int a[maxn], sum[maxn], vis[maxn];
int main() {
int n;
while (cin >> n) {
memset(vis, -1, sizeof(vis));
sum[0] = vis[0] = 0; //余数为0时一个即可,置为非-1
for (int i = 1; i <= n; i++) {
cin >> a[i];
sum[i] = (sum[i - 1] + a[i]) % n;
}
for (int i = 1; i <= n; i++) {
if (vis[sum[i]] == -1)
vis[sum[i]] = i;
else { //找到两个余数相同的
cout << i - vis[sum[i]] << "n";
for (int j = vis[sum[i]] + 1; j <= i; j++)
cout << a[j] << "n";
break;
}
}
}
return 0;
}
这一题的变形还有很多,都是抽屉原理,换汤不换药: POJ-3370 Halloween treats HDU-3183 A Magic Lamp HDU-5776 sum
原创不易,请勿转载(
本不富裕的访问量雪上加霜) 博主首页:https://blog.csdn.net/qq_45034708
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 浅谈推进有赞全站 HTTPS 项目-工程篇
- Checks autowiring problems in a bean class问题解决
- 有赞权限系统
- python处理txt文件常用方法
- 修改springboot运行时命令行Banner
- 适应性页面自己的看法
- Vant 1.0 正式发布:轻量、可靠的移动端 Vue 组件库
- SAP CDS view单元测试框架Test Double介绍
- 漫谈 React 组件库开发(二):组件库最佳实践
- 搭建简易的物联网服务端和客户端-移动家庭能力平台【1】(二十三)
- 异步系统的两种测试方法
- 实习第五周
- 跨平台长连接组件设计及可插拔改造
- 搭建简易的物联网服务端和客户端-移动家庭能力平台【2】(二十四)
- 一些能提高ABAP开发人员日常工作效率的ABAP小工具