1. 程式人生 > >[ACM]吃糖果

[ACM]吃糖果

Problem Description

HOHO,終於從Speakless手上贏走了所有的糖果,是Gardon吃糖果時有個特殊的癖好,就是不喜歡將一樣的糖果放在一起吃,喜歡先吃一種,下一次吃另一種,這樣;可是Gardon不知道是否存在一種吃糖果的順序使得他能把所有糖果都吃完?請你寫個程式幫忙計算一下。

Input

第一行有一個整數T,接下來T組資料,每組資料佔2行,第一行是一個整數N(0<N<=1000000),第二行是N個數,表示N種糖果的數目Mi(0<Mi<=1000000)。

Output

對於每組資料,輸出一行,包含一個"Yes"或者"No"。

Sample Input

2
3
4 1 1
5
5 4 3 2 1

Sample Output

No
Yes

Hint

Hint
Please use function scanf

Author

Source

Gardon-DYGG Contest 2

解題思路:

本題其實不需要什麼特別的演算法,最大數目的糖果起著重要作用,因為要求每次吃的糖果不一樣,當你吃某一種糖果時,不用管其它種類的糖果還剩幾個,都可以拿最大數目的糖果來湊數,來完成兩次吃不同種類的糖果的要求,因此只要把最大數目的糖果和其它種類糖果數目之和的值進行比較即可,但最大數目-其它之和大於1時,肯定不符合要求,輸出No,否則輸出Yes。

程式碼:

#include <iostream>
using namespace std;
int kind[1000005];
int main()
{
    int t; //t組資料
    int n; //n種類
    cin>>t;
    int i,j;
    for(i=1;i<=t;i++)
    {
        cin>>n;
        int max=0;//數目最多的糖果
        for(j=0;j<n;j++)
            {
                cin>>kind[j];
                if(max<kind[j])
                    max=kind[j];
            }
        long long sum=0;//要用long long ,不能用int,因為1000000 * 1000000超出int範圍
        for(j=0;j<n;j++)
        {
            if(kind[j]<max)
                sum+=kind[j];
        }

         if(max-sum>1)
            cout<<"No"<<endl;
        else
            cout<<"Yes"<<endl;
    }
    return 0;
}

執行截圖: