カヌーでの旅(貪欲)

カヌー旅行の場合、カヌーは港で借りることができ、それらの間に違いはありません。カヌーは最大2人までしか運ぶことができず、乗客の総重量はカヌーの最大容量を超えることはできません。このイベントの費用を最小限に抑えたいので、すべての乗客を収容できるカヌーの最小数を見つける必要があります。カヌーの最大容量、乗客数、各乗客の体重を読み取るプログラムを作成してください。与えられたルールに従って、すべての乗客を収容するために必要なカヌーの最小数を計算し、結果を出力します。
入力
最初の行の入力sは、テストデータのグループの数を示します。データ
の各グループの最初の行には、2つの整数w、n、80 <= w <= 200,1 <= n <= 300が含まれ、wはカヌーです。 nの最大運搬能力は人数です。
次のデータセットは各人の体重です(船の運搬能力以下)。


各グループの人々が必要とする最小数のカヌーを出力します。

サンプル入力
3
85 6
5 84 85 80 84 83
90 3
90 45 60
100 5
50 50 90 40 60
出力例
5つの
3
3
アイデア:
1.ソート最初
。2.最大量の左端と右端の和を比較する
場合条件が満たされている場合は、左端と右端、つまりL ++、R-、およびカウンターcnt ++が外れます。
条件が満たされていない場合は、1つしか外に出られないことを意味します。次に、右端のボード(貪欲)の人に(小さいものから大きいものに並べ替えた後、最大のものは右側にあります)、R–とカウンターcnt ++のみを許可します
。L== Rの場合、ループを解除します。cnt++
コードは次のとおりです。

#include <iostream>
#include<algorithm>
#include<cstdio>
#include<cstdlib>
using namespace std;
typedef long long ll;

int main()
{
    
    
    ios::sync_with_stdio(false);
    int s;
    cin >> s;
    while (s--)
    {
    
    
        int w, n;
        cin >> w >> n;
        int a[310];
        for (int i = 1; i <= n; i++) {
    
    
            cin >> a[i];
        }
        sort(a + 1, a + 1 + n);
        int cnt = 0;
        int l = 1, r = n ;
        while (l <= r)
        {
    
    
            if (a[l] + a[r] <= w) {
    
    
                cnt++;
                l++;
                r--;
            }
            else
            {
    
    
                cnt++;
                r--;
            }
        }
        cout << cnt << endl;
    }
    return 0;
}

おすすめ

転載: blog.csdn.net/wenchlove/article/details/111790085