UVA_10664_Luggage(水题)

ピーターとその友人たちは休暇中なので、
スペイン北部を知るために車で旅行することにしました彼らは7人で、荷物は2台の車で十分だと思います。
出発する時間です。スーツケースの山が車から待っています。ドライバーは
、1つのブーツ
が他のブーツよりも重い重量を運ぶことを望んでいないため、各ブーツにどのスーツケースを入れる必要があるについて意見が異なります2つのブーツが同じ重量でロードすることは可能ですか?(明らかに
スーツケース開梱せずに!)
スーツケースの重量を表すmセットの数を検討します。
スーツケースをブーツに分配することが可能で、2つのブーツの重量が同じである場合、それぞれについて決定する必要があります
入力
入力の最初の行には、テストケースの数を示す整数mが含まれています。
テストケースごとに、1つのスペースで区切られたn個の整数(1≤n≤20)を含む行があります。
これらの整数は、各スーツケースの重みです。すべてのスーツケースの重量の合計は
200キログラム以下です。
出力
出力はm行で構成されます。i番目の行は、i番目のスーツケースの重みのセットに対応し
、2つのブーツ
がそれぞれのテストケースに対して同じ重みでロードされる可能性に応じて、文字列「YES」または「NO」含みます
サンプル入力
3
1 2 1 2 1
2 3 4 1 2 5 10 50 3 50
3 5 2 7 1 7 5 2 8 9 1 25 15 8 3 1 38 45 8 1
サンプル出力
いいえ
はい
はい

質問:一連の数字を与え、この数字のセットを2つの等しい部分に分割できるかどうか尋ねます

アイデア:配列を並べ替え、2つのグループを最大から最小に追加します。追加したグループの数が少ない場合は、追加後に2つのグループが等しい場合は実行できますが、それ以外の場合は実行できません。(注:入力時に各グループの数は指定されていません。この記事の入力方法は比較的単純だと思います)

ACコード:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<string>
using namespace std;
int a[10010];
int main()
{
    
    
    int n;
    char ch;
    cin>>n;
    while(n--)
    {
    
    
        int tot=0;
        while (~scanf("%d%c",&a[tot],&ch)&&ch==' ')
            tot++;
            sort(a,a+tot+1);
            int l=0,r=0;
        for(int i=tot;i>=0;i--) 
        {
    
    
            if(l<=r)
                {
    
    
                    l+=a[i];
                    continue;
                }

            if(l>r)
                r+=a[i];
        }

        if(l==r)
            printf("YES\n");
            else
                printf("NO\n");

    }
}

おすすめ

転載: blog.csdn.net/weixin_43244265/article/details/104414266