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

C++でコンポートを作るための最大果物数を求める方法

問題概要

3つの整数 a、b、c が与えられます。それぞれ「レモンが a 個」「リンゴが b 個」「洋梨が c 個」あることを表します。コンポートを作るには、果物の比率を 1 : 2 : 4(レモン:リンゴ:洋梨)にする必要があります。また、果物を切って使うことはできません。この条件のもとで、コンポートを作るために使える果物の合計数の最大値を求めます。1つも作れない場合は 0 を返します。

入力例

例えば、a = 4、b = 7、c = 13 の場合、出力は 21 になります。これは、レモン3個、リンゴ6個、洋梨12個を使用でき、3 + 6 + 12 = 21 となるためです。

解法のアプローチ

この問題は非常にシンプルに解くことができます。ポイントは次の通りです。

  • レモンはそのまま最大 a 個まで使用可能
  • リンゴは2個で1セットのため、b ÷ 2 の切り捨て値まで使用可能
  • 洋梨は4個で1セットのため、c ÷ 4 の切り捨て値まで使用可能

したがって、これら3つの値の最小値が作れる「セット数」となり、1セットあたりの合計個数である 7(1 + 2 + 4)を掛けることで答えが求まります。

return 7 * min(a, min(b / 2, c / 4));

C++での実装例

以下に実際の実装例を示します。

#include <bits/stdc++.h>
using namespace std;
int solve(int a, int b, int c){
    return 7 * min(a, min(b / 2, c / 4));
}
int main(){
    int a = 4;
    int b = 7;
    int c = 13;
    cout << solve(a, b, c) << endl;
}

入力

4, 7, 13

出力

21

計算量について

このアルゴリズムは比較と算術演算のみを行うため、時間計算量は O(1)、空間計算量も O(1) です。入力の大きさに関わらず一定時間で結果を得られる点が大きな魅力です。

  1. C++で最長のスネークシーケンスを見つける方法

    概念数値のグリッドが与えられたとき、その中から最大長のスネークシーケンス(Snake Sequence)を求め、表示する問題について解説します。最大長を持つスネークシーケンスが複数存在する場合は、そのうちのどれか1つを出力すれば構いません。ここでいうスネークシーケンスとは、グリッド内の隣接する数値をつなげた列のことです。各数値に対して、その右側または下側にある数値が「+1」か「-1」の関係になっている必要があります。例えば、現在グリッド上の位置 (a, b) にいる場合、右隣の (a, b+1) の数値が ±1 であれば右へ移動でき、下の (a+1, b) の数値が ±1 であれば下へ移動でき

  2. C++で配列内の最長の連続する偶数の個数を求める方法

    要素数 n の配列 A が与えられたとき、その中に含まれる「連続した偶数」の最大個数を求める問題を考えてみましょう。例えば、配列が A = [1, 2, 3, 4, 6, 8, 7] の場合、4・6・8 と偶数が3つ続いているため、答えは 3 となります。アルゴリズムの考え方この問題は非常にシンプルな方法で解くことができます。ポイントは2つのカウント変数を用意することです。max_current: 現在進行中の連続する偶数の個数max_till_now: これまでに見つかった最大の連続偶数の個数配列を先頭から順に走査し、偶数を見つけたら max_current を1増やして、max_till_