程序冗杂造成时间超限

题目描述
HOHO,终于从Speakless手上赢走了所有的糖果,是Gardon吃糖果时有个特殊的癖好,就是不喜欢连续两次吃一样的糖果,喜欢先吃一颗A种类的糖果,下一次换一种口味,吃一颗B种类的糖果,这样;可是Gardon不知道是否存在一种吃糖果的顺序使得他能把所有糖果都吃完?请你写个程序帮忙计算一下。

输入
第一行有一个整数T,接下来T组数据,每组数据占2行,第一行是一个整数N(0 < N <= 1000000),表示糖果的种类。第二行是N个数,表示每种糖果的数目Mi(0 < Mi <= 109)。

输出
对于每组数据,输出一行,包含一个"Yes"或者"No"。

样例输入 Copy
2
3
4 1 1
5
5 4 3 2 1
样例输出 Copy
No
Yes
求问:一般应从哪些方面优化程序;
次啊面试我写的代码,程序正确但时间超限

img

这种是排列的问题,有一种思路是插空法 就是选出来最大的那种糖果的数量 假设是m个,那么这个m个作为一个排列,中间需要插入其它糖果,至少是m-1个,也就是有m-1个空位。如果剩余的糖果总和小于m-1个,那么这种最大的种类肯定是有相邻的,如果大于m-1个只要依次插入到上面m-1个空位就行了
所以代码可以简化为 计算输入糖果总和s + 计算最大种类的m 判断一下 s-m > m-1 输出yes,else no。 只要一层循环即可


还有一种方法就是,从大到小进行排序,然后从头开始逐步消除,消除到最后最后剩下1或者0,输出yes,else no。这种需要一个排序
例如消除的方式是 5 4 3 2 1 , 5 4消除剩下1, 1 3消除剩下 2, 2 2消除剩下0, 0 1消除剩下 1, yes


多插一句,多刷点面试题,现在变态的很