先放题目:
2
3
4 1 1
5
5 4 3 2 1
Sample Output
No
Yes
Please use function scanf
这道题我苦思冥想,也没想到用到抽屉这个模型。
抽屉原理,也称鸽巢原理:
给n个抽屉 往里面放n+1个苹果 ,那么至少有一个抽屉放了两个苹果,扩展一下 放k*n+1个苹果那么至少有一个抽屉放了K+1个苹果(在现实中有挺大的用处)
但是我再一想,好像用到了抽屉这个模型,并没有用到抽屉原理,,ԾㅂԾ,, 下面看推导
设在n种糖果中,最多数量的糖果个数为MM ,所以其他种类的糖果数量一定小于等于MM
设其他n-1种糖果总个数为sum 有MM个抽屉并放在一起,先将那MM个糖果放过放进去,再放剩下的sum个糖果
假设从右到左一个一个放糖果,直至每个这排抽屉都放过完再从右往左放,放的过程中每个抽屉里的糖果都不会重样。
1.如果每个抽屉的糖果都大于等于2个 那么在吃糖果时一定不会重样,
因为每个抽屉吃完后都已经确认出吃的最后一个糖果是那种,然后吃下一个抽屉的糖果时因为有多种糖果,肯定能选一种方法再将这一抽屉的糖果吃完,以此类推。所以糖果肯定能吃完。
2.如果只有一个抽屉有一个MM糖果,其他的糖果都大于等于2,也可以吃完(只要选第一个吃的糖果不是MM就可以吃完)
那么上面的情况之外情况:两个或者两个以上的抽屉只有一个MM糖果(其他抽屉理所当然的有两个糖果),
这种情况可以吃掉吗? 答案是不能
假设有剩下有两个抽屉都只有一个糖果 那么看图
当吃过只有一个糖果抽屉里的糖果时,若吃下一个有两个糖果的抽屉的糖果时,最后吃的一定还是这个MM糖果
所以每次最后的都是MM糖果就导致剩下一个抽屉(只有MM糖果的抽屉)不能被吃掉。 故不能(我也想不到更好的方法去吃糖果了O(∩_∩)O)
故在输入数据中 只要sum>=MM-1 就一定能吃完所有的糖果。
#include
#include
#include
#include
#include
#include
#define N 1000000
#define wc 1e-6
#define MOD 10
using namespace std;
//int candy[N+100];
int main()
{
int t,n,maxx=0,mod;
long long sum;
scanf("%d",&t);
while(t--)
{
sum=0;
maxx=0;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&mod);
sum+=mod;
if(mod>maxx)
maxx=mod;
}
sum=sum-maxx;
if(sum+1>=maxx)
printf("Yes\n");
else
printf("No\n");
}
}
一个好的模型可以能让一个问题变得非常容易。