(感觉有些意外。。。)
这道题的思路是这样的:
本题可以等价转化为摆放所有的糖果,
且将所有的糖果摆放以后同一种糖果中任意两个都不能互为“邻居”。
(1) 先将数量最多(假设数量为 max)的糖果摆好,
于是就会留下 max 个“间隔”;
(2) 再在留下的 max 个“间隔”中放入其它的糖果,
这时就会发现一个问题:
除去数量最多的那种糖果,
如果剩余的糖果总数比 max-1 还要少的话,那么数量最多的那种糖果
就会存在至少有两个糖果“互为邻居”的情况。
(这种情况不符合题意,应输出“No”,其余的情况就满足题意,应输出“Yes”)
具体代码如下:
Exe.Time 156MS
Exe.Memory 212K
#include<stdio.h>
int main()
{
int t,n,m;
int max; // 用于存储数量最多的糖果数
__int64 sum; // 用于存储糖果的总数
scanf("%d",&t);
while(t--)
{
sum=max=0;
scanf("%d",&n);
while(n--)
{
scanf("%d",&m); // 输入每种糖果的数目
sum+=m;
if(m>max)
max=m;
}
sum-=max; // 除去数量最多的糖果
if(sum<max-1)
printf("No\n");
else
printf("Yes\n");
}
return 0;
}