个人思想:
先找出最大的集数,设为max ,其他的集数累加值为 sum 。
只要max > sum 或者 |max-sum|%2==1 (即 max与sum奇偶数不同) ,此时为No.
否则,为Yes.
原因:
把最大的集数跟其他累加集数分别看成二个条柱(A,B)。要是二者一样高,则为Yes。
如果最大的集数最高A,那么,无论如何其他累加集数B的条柱都不可能超过他,即为No。
反过来,如果其他集数的条柱B高过最大集数A。由于本身是由非最大集数的所有累加而成,所以其本身也有抵消作用(即一次换一集) ,每次就是下降2 。 如果 二者奇偶性相同,那么,其他条柱B每次下降2,总有跟A柱子相等的时候,此时也为 Yes 。如果奇偶性不同,则无论如此下降多少次,柱子都不可能相等,所以为No。
代码:
#include
#include
typedef __int64 uint;
int main()
{
int m;
scanf("%d",&m);
while(m--)
{
int n;
scanf("%d",&n);
int i;
uint sum=0;
uint max=0;
uint tmp;
for(i=0;i{
scanf("%I64d",&tmp);
if(maxsum+=tmp;
}
sum-=max;
bool bFlag=true;
if(max>sum || (max-sum) % 2 ==1) {bFlag=false; }
printf("%s\n",(bFlag?"Yes":"No"));
}
return 0;
}