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

C++で解く:数字パネルを並べて作れるお小遣いの最大額を求めるプログラム

3つの整数 A、B、C が与えられます。ここで次のようなゲームを考えてみましょう。「整数パネル」が3枚あり、それぞれに1から9までの数字が1つずつ書かれています。また、「+」記号が書かれた「演算子パネル」が1枚あります。プレイヤーはこれら4枚のパネルを左から右へ並べ、X+Y の形の式を作らなければなりません。そして、その式の計算結果がもらえるお小遣いの金額になります。

この記事では、このゲームで得られるお小遣いの最大額を求める方法を解説します。

具体例

例えば、入力が A = 1、B = 5、C = 2 の場合、出力は 53 になります。これは、パネルを「52+1」という順序で並べたときにお小遣いが最大になるためです。

解き方のアプローチ

この問題は貪欲法の考え方で非常にシンプルに解くことができます。ポイントは、2桁の数値を作る際に、できるだけ大きな数字を十の位に配置した方が合計が大きくなるという点です。したがって、以下の手順で答えを求めます。

  1. A、B、C を配列 V に格納する
  2. 配列 V を昇順にソートする
  3. ans = V[2] × 10 + V[1] + V[0] を計算する
  4. ans を返す

ソート後、最も大きい数 V[2] を十の位に置いて2桁の数を作り、残りの2つの数 V[1] と V[0] を一の位側に加算します。こうすることで、常に最大の結果が得られます。要素数が3個のみのため、計算量は事実上 O(1) と非常に効率的です。

C++での実装例

それでは、実際のコードを見てみましょう。

#include <bits/stdc++.h>
using namespace std;

int solve(int A, int B, int C){
    vector<int> V = { A, B, C };
    sort(V.begin(), V.end());
    int ans = (V[2] * 10) + V[1] + V[0];
    return ans;
}

int main(){
    int A = 1;
    int B = 5;
    int C = 2;
    cout << solve(A, B, C) << endl;
}

入力

1, 5, 2

出力

53

まとめ

この問題のように、パネルや数字の並び替えで最大値・最小値を求める問題では、「大きい数字を上位の桁に配置する」という貪欲な戦略が有効です。ソートさえ行えば答えは一行で導けるため、競技プログラミングの入門者にとっても取り組みやすい良問といえます。

  1. 【C++】グラフの連結性を保ちながら辺を削除し、スコアの最大削減量を求める方法

    問題概要 n 個の頂点と m 本の辺からなる重み付き無向グラフを考えます。グラフの「スコア」は、含まれるすべての辺の重みの総和として定義されます。辺の重みは負になることもあり、そのような辺を取り除くとかえってスコアが増えてしまいます。 ここで求めたいのは、グラフを連結状態に保ったまま不要な辺を削除してスコアを最小化し、「スコアを最大でどれだけ減らせるか」を計算することです。 グラフは配列 edges として与えられ、各要素は {weight, {vertex1, vertex2}}(重みと両端の頂点)という形式で表されます。 入力例と出力 たとえば n = 5、m = 6、edges = {

  2. グラフの最大カットを求めるC++プログラム ― 辺連結性と橋(ブリッジ)の検出

    本記事では、グラフの最大カットを求める問題に関連して、グラフの辺連結性を調べるC++プログラムを紹介します。ここで扱うのは「橋(ブリッジ)」と呼ばれる特別な辺の検出です。 橋(ブリッジ)とは何か? 無向グラフにおける橋(ブリッジ)とは、その辺を取り除いた瞬間にグラフが非連結になってしまう辺のことです。言い換えれば、橋を1本取り除くだけで、グラフの連結成分の数が増加します。この性質を利用すると、ネットワークの中で特に脆弱な箇所(切断されやすいリンク)を特定できます。 アルゴリズムの考え方と擬似コード 橋の検出には、深さ優先探索(DFS)を用いるのが定番です。各頂点に対して「発見時刻(dis)」と