糖果
时间限制:1000 ms | 内存限制:65535 KB
难度:2
- 描述
- topcoder工作室的PIAOYIi超级爱吃糖果,现在他拥有一大堆不同种类的糖果,他准备一口气把它们吃完,可是他有一个习惯,他不喜欢同一种类的糖果连着吃,他喜欢先吃一种,然后再吃另一种。可是PIAOYI不知道是否存在一种顺序能把这些糖果吃完,聪明的你可以帮助他吗?
- 输入
- 第一行有一个整数N,接下来有N组数据,第一行有一个整数M(0<M<1000000),第二行是M个数,表示M种糖果的数目Mi(0<Mi<1000000).
- 输出
- 对于每组数据,输出一行,包含一个“Yes”或者“No”。
- 样例输入
-
2 3 1 1 5 5 1 2 3 4 5
- 样例输出
-
No Yes
这个已经AC
1 #include<stdio.h> 2 int main() 3 { 4 long long T,i,j,n,max,sum,num; 5 scanf("%lld",&T); 6 for(i=0;i<T;i++) 7 { 8 max=0;sum=0; 9 scanf("%lld",&n); 10 for(j=0;j<n;j++) 11 { 12 scanf("%lld",&num); 13 sum=num+sum; 14 if(max<num)max=num; 15 } 16 sum=sum-max; 17 if(max>1+sum) 18 printf("No\n"); 19 else printf("Yes\n"); 20 } 21 return 0; 22 }
下面的WA了
一种错误的方法,因为应该先吃多的糖果 例如2 2 2 10 7按一下的程序 应该输出NO但其实是Yes
因为先吃10和7,当7吃完时10还剩3个,再和2 2 2,倒着循环,正好可以
1 #include<stdio.h> 2 int main() 3 { 4 long long a[1000010]; 5 long long x,t,n,k,i,j; 6 int m; 7 scanf("%lld",&t); 8 while(t--) 9 {m=0; 10 scanf("%lld",&n); 11 for(i=0;i<n;i++) 12 scanf("%lld",&a[i]); 13 for(;;) 14 { 15 k=0;x=0; 16 for(j=0;j<n;j++) 17 { 18 if(a[j]!=0) 19 { 20 a[j]=a[j]-1; 21 k++; 22 x=j; 23 } 24 } 25 if(k==1||k==0) 26 { 27 if(a[x]==0) 28 {m=1;break;} 29 else 30 {m=0;break;} 31 } 32 } 33 if(m==1) 34 printf("Yes\n"); 35 else printf("No\n"); 36 } 37 return 0; 38 }