C++でHPを最高カテゴリにアップグレードするために必要な増加量を求める方法
問題の概要
数値 n が与えられます。あるゲームでは、各キャラクターのヒットポイント(HP)は以下の4つのカテゴリのいずれかに分類されます。
- カテゴリA:HPが (4n + 1) の形式の場合
- カテゴリB:HPが (4n + 3) の形式の場合
- カテゴリC:HPが (4n + 2) の形式の場合
- カテゴリD:HPが 4n の形式の場合
これら4つのカテゴリは A > B > C > D の順に優先度が決まっており、カテゴリAが最も高く、カテゴリDが最も低くなります。ゲーム中、プレイヤーはキャラクターのHPを増やすことが可能です。ここで、Amalは自分のHPを最大2まで(つまり0、1、または2のいずれか)増やしたいと考えています。HPをできる限り高いカテゴリにするには、いくつ増やせばよいのでしょうか?
例として、入力が n = 98 の場合を考えてみましょう。このとき出力は「1 B」になります。98は (4×24 + 2) という形式なのでカテゴリCに該当します。1増やせば99となりカテゴリBへアップグレードできますが、2増やすと100 (4×25) となり、かえってカテゴリDに下がってしまいます。したがって、達成可能な最高カテゴリはBで、必要な増加量は1となります。
解法のアプローチ
この問題は、n を4で割った余り(n mod 4)に着目することで非常にシンプルに解けます。以下の手順に従います。
n mod 4 が 2 の場合:
「1 B」を返す
それ以外の場合:
|(n mod 4) − 1| と「A」を返すなぜこのロジックで正しく動くのか
- n mod 4 = 1(カテゴリA):すでに最上位カテゴリのため、増加量は0。「0 A」を出力
- n mod 4 = 3(カテゴリB):2増やすと 4(n+1)+1 の形になりカテゴリAへ到達可能。「2 A」を出力
- n mod 4 = 2(カテゴリC):1増やせばカテゴリBになるが、2増やすとカテゴリDに下がるため「1 B」が最適
- n mod 4 = 0(カテゴリD):1増やすだけでカテゴリAになれるため「1 A」を出力
C++での実装例
理解を深めるために、以下の実装例を見てみましょう。
#include <bits/stdc++.h>
using namespace std;
void solve(int n){
if (n % 4 == 2)
cout << "1 B";
else
cout << abs(n % 4 - 1) << " A";
}
int main(){
int n = 98;
solve(n);
}実行結果
入力
98
出力
1 B
計算量
- 時間計算量:O(1) ― 剰余演算と条件分岐のみで処理が完結
- 空間計算量:O(1) ― 追加のデータ構造は不要
-
QRコードの作り方・読み取り方を徹底解説!初心者向け完全ガイド
街中や商品パッケージ、チラシなどで目にする機会が多いQRコード。四角い形で、角に小さな正方形が配置され、内部には複雑な模様や点々が描かれています。一見すると何の役に立つのか分かりにくいかもしれませんが、実はとても便利なツールなのです。 QRコードとは? QRコードは「Quick Response(クイックレスポンス)」の略称です。スーパーのレジでバーコードを読み取って価格情報を照会するのと同じように、QRコードもスキャンすることで、あの複雑なデザインの中に隠された情報を取り出すことができます。 バーコードとの大きな違いは、誰でもQRコードを作成できるという点です。企業だけでなく、個人
-
C++で指定された数より大きい次の完全平方数を求める方法
整数 n が与えられたとき、n より大きい最小の完全平方数(ある整数の 2 乗で表される数)を求める問題を考えてみましょう。例えば、n = 1000 の場合、次の完全平方数は 32² = 1024 となります。 解法の考え方 この問題は、以下のシンプルな手順で解くことができます。 与えられた数 n の平方根を求める その値の小数点以下を切り捨てる(floor 処理) 切り捨てた値に 1 を加え、その 2 乗を計算して返す n の平方根の整数部分を r とすると、r² ≤ n が成り立つため、n より大きい次の完全平方数は (r + 1)² となります。 C++での実装例 #include