C++でNルピーで購入できる水の最大リットル数を求める方法
問題の概要
Nルピーが手元にある状態で、このお金で購入できる水の量を最大化することを目指します。水ボトルの価格設定は以下の通りです。
- ペットボトル:1リットルあたりAルピー
- ガラス瓶:1リットルあたりBルピー(空き瓶を返却するとEルピーが返金される)
ガラス瓶は返却によってEルピーが戻ってくるため、その実質コストは「B−E」ルピーになります。したがって、以下のように判断します。
- ペットボトルの価格AがB−Eより安い場合 → ペットボトルのみを購入するのが得です。
- それ以外の場合 → まずガラス瓶を優先的に購入し、残ったお金でペットボトルを補います。
入出力例
例1
N = 6, A = 5, B = 4, E = 3;
出力:
Maximum litres of water: 3
説明:B−E = 1 となり、1 < A なのでガラス瓶の方がお得です。手元の3ルピーで1リットル入りのガラス瓶を3本購入できます。
例2
N = 10, A = 5, B = 10, E = 3;
出力:
Maximum litres of water: 2
説明:B−E = 7 となり、7 > A のためペットボトルの方が安いことがわかります。よって 10 ÷ 5 = 2 本のペットボトル(計2リットル)を購入できます。
アルゴリズムのアプローチ
- 所持金money、ペットボトルpbottle、ガラス瓶gbottle、返金額gemptyの各整数変数で価格と所持金を管理します。
- 関数maxWater(int mny, int pb, int gb, int ge)がすべての値を引数として受け取り、購入できる水量を出力します。
- 変数litrsは、計算された水のリットル数を格納するために使用します。
- ガラス瓶の新しい価格(元の価格から返金額を差し引いた値)をgbとして渡します。
- 渡されたgbの値がpbより小さい場合、(mny−ge/gb)個のガラス瓶を購入します。
- 購入金額を差し引いて残金を計算します:mny -= litrs * gb
- 次に、残金で購入できるペットボトルの本数は mny / pb となります。
- 渡されたpbの値がgbより大きい場合は、ペットボトルのみを mny / pb 本購入します。
- どちらの場合も結果を出力します。各ボトルは1リットル入りなので、ボトルの本数がそのまま水のリットル数になります。
C++での実装例
// 上記アプローチのC++実装
#include<bits/stdc++.h>
using namespace std;
void maxWater(int mny,int pb,int gb,int ge){
int litrs;
// ガラス瓶を購入する方が得な場合
if (gb < pb){
// ガラス瓶の本数
int tmp=mny-ge/gb;
litrs=tmp>0?tmp:0;
mny-=litrs*gb;
// ペットボトルの本数
litrs+=mny/pb;
cout<<"Maximum Liters of water : "<<litrs<<endl;
}
// ペットボトルのみの場合
else
cout<<"Maximum Liters of water only Plastic bottles: "<<(mny /pb)<<endl;
}
int main(){
int money = 20, pbottle=5, gbottle=10, gempty = 8;
gbottle=gbottle-gempty; // ガラス瓶の新しい価格
maxWater( money,pbottle,gbottle,gempty );
}
出力
Maximum Liters of water: 14
この例では、所持金20ルピー、ペットボトル5ルピー、ガラス瓶10ルピー、返金額8ルピーが与えられています。ガラス瓶の実質コストは 10−8 = 2ルピーとなり、ペットボトル(5ルピー)よりも安いため、ガラス瓶を優先して購入することで合計14リットルの水を入手できます。
-
C++で長方形をちょうどk回カットしたときに得られる最小面積の最大値を求める方法
このチュートリアルでは、与えられた長方形に対してちょうどk回のカットを行ったとき、分割後のピースの中で最小となる面積が取りうる最大値を求めるプログラムをC++で解説します。 入力として長方形の2辺の長さ(n・m)とカット回数kが与えられます。目的は、指定された回数だけカットを行った結果として実現できる最小面積を計算し、その分割戦略を最適化することです。 アルゴリズムのポイント 長方形を片方の辺に沿って切ると、その辺は(k+1)個に分けられます。整数除算では端数が切り捨てられるため、どの方向に・どう配分してカットするかが最小ピースの面積を左右します。処理の流れは以下の通りです。 k >
-
C++でN×Nチェス盤に配置できるビショップの最大数を求める方法
問題概要チェス盤のサイズを表す整数 N が入力として与えられます。この問題では、任意の N に対して、N×N のチェス盤上に互いに攻撃し合わないようにビショップ(bishop)を最大何個配置できるかを求めます。まず、具体例を使って理解していきましょう。例1入力: N = 2出力: N×N チェス盤に配置できるビショップの最大数 ― 2説明: 2×2 のチェス盤の場合、互いに干渉しない位置は図示された場所のみです。つまり、2×2 の盤面に配置できるビショップは最大 2 個となります。例2入力: N = 5出力: N×N チェス盤に配置できるビショップの最大数 ― 8プログラムで使用するアプローチ