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

C++で2つの数による割り切り条件から利益を最大化する方法


問題の概要

5つの整数 N、A、B、X、Y が与えられます。目標は、1からNまでの範囲の各数について次の条件を確認し、利益を最大化することです。

  • ある数が A で割り切れる場合、利益が X 増加します。
  • ある数が B で割り切れる場合、利益が Y 増加します。

ただし、同じ数に対して利益を加算できるのは1回だけです。そのため、AとBの両方で割り切れる数については、XとYのうち大きい方を選ぶのが最適戦略となります。

具体例を見てみましょう。

例1

入力: N=4, A=2, B=3, X=2, Y=3

出力: 最大化された利益は 7

説明:

2と4はA(2)で割り切れるため、利益は0→2→4と増加します(X=2を2回加算)。

3はB(3)で割り切れるため、利益は4→7に増加します(Y=3を加算)。

例2

入力: N=5, A=2, B=4, X=1, Y=3

出力: 最大化された利益は 4

説明:

2と4はA(2)で割り切れ、さらに4はB(4)でも割り切れます。

2については利益が0→1に増加し(X=1)。一方、4についてはY(3)の方がX(1)より大きいためBによる割り切りを選択し、利益は1→4に増加します(Y=3を加算)。

アプローチ

この問題は、1からNまでの各数を順に調べるシンプルなシミュレーションで解くことができます。手順は以下の通りです。

  • 整数 N、A、B、X、Y を引数として受け取り、最大化された利益を返す関数 maximizeProfit(int n, int a, int b, int x, int y) を定義します。
  • 変数 profit に利益の合計を保持します。初期値は0です。
  • forループで1からnまでの各数 i について、a および b での割り切りを判定します。
  • i が a と b の両方で割り切れる場合は、x と y の大きい方を利益に加算します。
  • i が a のみで割り切れる場合は x を加算します。
  • i が b のみで割り切れる場合は y を加算します。
  • ループ終了後、profit の値を結果として返します。

各数を1回ずつ調べるだけなので、時間計算量は O(N)、追加メモリは不要で空間計算量は O(1) です。

C++実装例

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

// 最大の利益を返す関数
int maximizeProfit(int n, int a, int b, int x, int y){
    int profit = 0;
    for(int i = 1; i <= n; i++){
        // aとbの両方で割り切れる場合は大きい方を加算
        if(i % a == 0 && i % b == 0){
            int maxx = x >= y ? x : y;
            profit += maxx;
        }
        // aのみで割り切れる場合
        else if(i % a == 0){
            profit += x;
        }
        // bのみで割り切れる場合
        else if(i % b == 0){
            profit += y;
        }
    }
    return profit;
}

int main(){
    int N = 6, A = 2, B = 4, X = 6, Y = 3;
    cout << "Maximized profit is: " << maximizeProfit(N, A, B, X, Y);
    return 0;
}

出力

上記のコードを実行すると、次の出力が得られます。

Maximized profit is: 18

この結果の内訳は次の通りです。1〜6の範囲で2(A)で割り切れるのは2、4、6の3つです。4は4(B)でも割り切れますが、X=6がY=3より大きいため、いずれの場合も6が加算されます。よって利益は 6+6+6=18 となります。


  1. C++で3つ以上の数値(または配列)の最大公約数(GCD)を求める方法

    本記事では、3つ以上の数値の最大公約数(GCD)をC++で求める方法を解説します。2つの数値のGCDを求めるのは簡単ですが、3つ以上の数値を扱う場合はGCDの結合法則を利用します。例えば、{w, x, y, z} のGCDを求めたい場合、以下のように段階的に計算します。まず {gcd(w, x), y, z} を計算次に {gcd(gcd(w, x), y), z) を計算最後に {gcd(gcd(gcd(w, x), y), z)} を計算この手法を配列に適用すれば、任意の個数の数値に対してGCDを簡単に求めることができます。アルゴリズムgcd(a, b)begin    

  2. 【C++】2つの数値を交換(スワップ)するプログラムの書き方

    2つの数値を交換(スワップ)するC++プログラムを作成する方法は、主に2つあります。1つ目は一時変数(temp変数)を使用する方法で、2つ目は第3の変数を使わない方法です。ここでは、それぞれの方法についてサンプルコード付きで詳しく解説します。一時変数を使って2つの数値を交換するプログラムまず、一時変数を使って2つの数値を交換する基本的なプログラムを見てみましょう。サンプルコード#include <iostream>using namespace std;int main() {   int a = 10, b = 5, temp;   tem