C++
 Computer >> コンピューター >  >> プログラミング >> C++

C++で解く:パーティーの全員が好きなアイスクリームを受け取れるか判定する方法

あるパーティーに、性質の異なる3つのグループの人々が参加するとします。

1つ目のグループ: バタースコッチ味のアイスクリームしか好まず、他の味は一切食べません。
2つ目のグループ: ストロベリー味だけが苦手で、それ以外の味はすべて好きです。
3つ目のグループ: どんな味のアイスクリームでも喜んで食べます。

ここで、1つ目のグループから x 人、2つ目のグループから y 人、3つ目のグループから z 人がパーティーに参加し、参加者全員が少なくとも1個は自分の好きなアイスクリームを受け取れなければなりません。一方、主催者が用意したアイスクリームは、バタースコッチ味が a 個、チョコレート味が b 個、ストロベリー味が c 個です。このとき、全員が満足できる配布が可能かどうかを判定するのが本問題の目的です。

例えば、a = 6、b = 5、c = 5、x = 3、y = 8、z = 4 という入力が与えられた場合、出力は「Possible(可能)」となります。

考え方と解法の手順

この問題のポイントは、選択の自由度が最も低いグループから順番に確認していくことです。1つ目のグループはバタースコッチ味しか食べられないため、まず「a ≥ x」が必須条件となります。さらに、1つ目と2つ目のグループはどちらもストロベリー味を食べられない(または食べたくない)ため、「a + b ≥ x + y」が成り立つ必要があります。最後に、全員分の総数を見て「a + b + c ≥ x + y + z」であれば、全体としての個数も足りていることになります。この3つの条件がすべて満たされれば「Possible」、一つでも満たされなければ「Not Possible」と判定できます。

擬似コードで表すと以下のようになります。

if a < x or a + b < x + y or a + b + c < x + y + z, then:
    print("Not Possible.")
Otherwise
    print("Possible.")

C++による実装例

理解を深めるために、実際のC++コードを見てみましょう。

#include <bits/stdc++.h>
using namespace std;
#define N 100
void solve(int a, int b, int c, int x, int y, int z) {
    if (a < x || a + b < x + y || a + b + c < x + y + z)
        cout<<"Not Possible.";
    else
        cout<<"Possible.";
}
int main() {
    int a = 6, b = 5, c = 5, x = 3, y = 8, z = 4;
    solve(a, b, c, x, y, z);
    return 0;
}

入力例

6, 5, 5, 3, 8, 4

出力例

Possible.

このアルゴリズムは単純な比較演算のみで構成されているため、計算量は O(1) となり、非常に効率的です。累積和の考え方を使って、制約の厳しいグループから順に在庫を割り当てていく発想は、類似の貪欲法(グリーディ法)の問題にも応用できる有用なテクニックです。

  1. C++でnラウンド制ゲームの勝者を判定するコード

    2人のプレイヤーが対戦するnラウンド制のゲームを考えてみましょう。各ラウンドのスコアは配列「scores」で与えられ、各要素は{P1のスコア, P2のスコア}という形式になっています。各ラウンドではスコアが高い方のプレイヤーがそのラウンドに勝利し、より多くのラウンドを制したプレイヤーがゲーム全体の勝者となります。両者の勝利数が同じ場合は引き分けと判定されます。この記事では、与えられたスコアをもとに、誰がゲームに勝ったのかを判定するプログラムをC++で実装します。例えば、入力が n = 4、scores = {{4, 3}, {3, 2}, {5, 6}, {2, 5}} の場合、出力は「Dra

  2. C++でバッテリーの組み合わせ数を求めるアルゴリズム

    最大5回まで使用できるバッテリーがn本あるとします。ここで、3本のバッテリーを必要とするデバイスがあり、デバイスを使用するたびにバッテリーの使用回数が1ずつ増加します。デバイスをk回使用したい場合、それらを動かすために何通りのバッテリーの組み合わせを作れるかを求める必要があります。ただし、1本のバッテリーを複数のデバイスで同時に使用することはできず、すでに5回使用されたバッテリーは組み合わせに含められません。各バッテリーの現在の使用回数は配列battとして与えられます。例えば、入力が n = 6、k = 2、batt = {2, 4, 4, 2, 1, 3} の場合、出力は 1 になります。こ