acm 练习题求解

2024年11月17日 22:25
有1个网友回答
网友(1):

个人思想:

先找出最大的集数,设为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(max sum+=tmp; 
}
sum-=max; 
bool bFlag=true; 
if(max>sum ||  (max-sum) % 2 ==1)  {bFlag=false; } 

printf("%s\n",(bFlag?"Yes":"No")); 


}
return 0; 
}