HDU 1205 吃糖果
2015-08-12 18:23
387 查看
题目地址:点击打开链接
思路:参考别人的,仔细想想其实不那么难的
把最多的那种 M(共计max个) 摆成一列,产生max-1个间隔,对于M来说,其他的糖果都是异类 (共计 sum-max个),可以用来填充间隔,但是如果sum-max<max-1的话,间隔不
能被填满,所以会有相邻的M,不符合要求 printf("No\n");
当sum-max>=max-1时,M的间隔一定能被填满 printf("Yes\n");
注意sum数值较大
在异类中任选一种糖果N (N<=sum-max) 填进间隔 ,之后M与N合并代替之前的M。
循环上一步直至结束
MMMMM NNNN BBBB VVV CC X
从箭头处开始插入
↓
M M M M M
↓
MN MN MN MN M
↓
MNB MNB MNB MN MB
↓
MNBV MNB MNB MNV MBV
↓
MNBV MNBC MNBC MNV MBV
MNBV MNBC MNBC MNVX MBV
1.把某种糖果看做隔板,如果某种糖果有n个,那么就有n+1块区域,至少需要n-1块其他种糖果才
能使得所有隔板不挨在一块..也就是说能吃完这种糖果.至少需要其他种类糖果n-1块..(鸽巢原理)
2.数量最多的糖果(隔板)可以构造最多的空间,如果这种糖果有maxn个....那么需要maxn-1个其
他种糖果.对于某种数量少于maxn的糖果来说,可以在原本数量最多的糖果构造的隔板上"加厚"原
有的隔板...,那么这"某种糖果"就销声匿迹了.....
考虑极端情况.如果某种糖果无法在这maxn+1的空间内构造出符合条件的序列,那么这种糖果至
少要有maxn+1+1个(考虑只有两种糖果的情况)...(鸽巢原理)...但是这与数量最多的那种糖果只有
maxn个矛盾.....(maxn+1+1>maxn 这不等式不难理解吧....).
AC代码:
#include<stdio.h>
int main()
{
__int64 sum;
int t,n,maxn,i,x;
scanf("%d",&t);
while(t--)
{
sum = 0;
maxn = 0;
scanf("%d",&n);
for(i=0; i<n; i++)
{
scanf("%d",&x);
if(x > maxn)
maxn = x;
sum += x;
}
if(sum-maxn>=maxn-1)
printf("Yes\n");
else
printf("No\n");
}
return 0;
}
思路:参考别人的,仔细想想其实不那么难的
把最多的那种 M(共计max个) 摆成一列,产生max-1个间隔,对于M来说,其他的糖果都是异类 (共计 sum-max个),可以用来填充间隔,但是如果sum-max<max-1的话,间隔不
能被填满,所以会有相邻的M,不符合要求 printf("No\n");
当sum-max>=max-1时,M的间隔一定能被填满 printf("Yes\n");
注意sum数值较大
在异类中任选一种糖果N (N<=sum-max) 填进间隔 ,之后M与N合并代替之前的M。
循环上一步直至结束
MMMMM NNNN BBBB VVV CC X
从箭头处开始插入
↓
M M M M M
↓
MN MN MN MN M
↓
MNB MNB MNB MN MB
↓
MNBV MNB MNB MNV MBV
↓
MNBV MNBC MNBC MNV MBV
MNBV MNBC MNBC MNVX MBV
1.把某种糖果看做隔板,如果某种糖果有n个,那么就有n+1块区域,至少需要n-1块其他种糖果才
能使得所有隔板不挨在一块..也就是说能吃完这种糖果.至少需要其他种类糖果n-1块..(鸽巢原理)
2.数量最多的糖果(隔板)可以构造最多的空间,如果这种糖果有maxn个....那么需要maxn-1个其
他种糖果.对于某种数量少于maxn的糖果来说,可以在原本数量最多的糖果构造的隔板上"加厚"原
有的隔板...,那么这"某种糖果"就销声匿迹了.....
考虑极端情况.如果某种糖果无法在这maxn+1的空间内构造出符合条件的序列,那么这种糖果至
少要有maxn+1+1个(考虑只有两种糖果的情况)...(鸽巢原理)...但是这与数量最多的那种糖果只有
maxn个矛盾.....(maxn+1+1>maxn 这不等式不难理解吧....).
AC代码:
#include<stdio.h>
int main()
{
__int64 sum;
int t,n,maxn,i,x;
scanf("%d",&t);
while(t--)
{
sum = 0;
maxn = 0;
scanf("%d",&n);
for(i=0; i<n; i++)
{
scanf("%d",&x);
if(x > maxn)
maxn = x;
sum += x;
}
if(sum-maxn>=maxn-1)
printf("Yes\n");
else
printf("No\n");
}
return 0;
}
相关文章推荐
- Java
- Modeling with Sequence Diagram
- 使网页适应UIWebView的宽度
- 关于使用openfiler作为共享存储来安装rac时的问题
- Problem F: 最右边的数字
- Hadoop YARN新特性—label based scheduling
- Makefile中用宏定义进行条件编译(gcc -D)/在Makefile中进行宏定义-D
- Xtradb+Haproxy高可用数据库集群(四)集群zabbix监控篇
- Xtradb+Haproxy高可用数据库集群(四)集群zabbix监控篇
- Xtradb+Haproxy高可用数据库集群(四)集群zabbix监控篇
- CELL⾃适应⾼度
- WCF问题集锦:基础连接已经关闭 接收时发生错误
- C++易混淆的一点
- Java Servlet完全教程
- Chapter 16 notification iOS 8 -Swift Programming cookBook 读书笔记
- linux下用cmake
- css写三角形
- 自定义UITableViewCell(2) 多个自定义cell
- iOS到Android到底有多远
- 黑马程序员——面向对象(this关键字)-第11天