紙飛行機に必要な紙のパック数を計算するC++プログラムの解説
問題の概要
4つの整数 k、n、s、p が与えられます。紙飛行機を作るには、長方形の紙を使用します。標準サイズの紙1枚からは、s 機の紙飛行機を作ることができます。k 人のグループが、それぞれ n 機ずつ紙飛行機を作ることにしました。彼らは p 枚入りの紙のパックを何個か購入し、その紙をグループのメンバー全員に分配します。各人が n 機の紙飛行機を作れるだけの枚数を確保できるようにするには、パックを何個購入すればよいでしょうか?
例えば、入力が k = 5、n = 3、s = 2、p = 3 の場合、出力は 4 になります。1人あたり2枚の紙が必要となり、合計で12枚必要になるため、3枚入りのパックを4個購入する必要があるからです。
解き方の手順
この問題は、切り上げ除算のテクニックを使うことで簡単に解くことができます。以下の手順に従いましょう。
- 1人あたりに必要な紙の枚数は、n を s で切り上げ除算した値、つまり (n + s - 1) / s で求められます。
- この値に人数 k を掛けることで、グループ全体に必要な紙の総枚数 ans が計算できます。
- 最後に、ans を p で切り上げ除算した値を返します。これが購入すべきパックの個数です。
ans := k * ((n + s - 1) / s)
return (ans + p - 1) / p
実装例
理解を深めるために、以下のC++による実装例を見てみましょう。
#include <bits/stdc++.h>
using namespace std;
int solve(int k, int n, int s, int p){
int ans = k * ((n + s - 1) / s);
return (ans + p - 1) / p;
}
int main(){
int k = 5;
int n = 3;
int s = 2;
int p = 3;
cout << solve(k, n, s, p) << endl;
}
入力
5, 3, 2, 3
出力
4
このように、(x + d - 1) / d という形式の切り上げ除算を活用することで、必要な紙の枚数とパック数を効率よく計算できます。浮動小数点数を使わずに整数演算だけで処理できるため、誤差の心配もなく高速に動作するのがポイントです。
-
C++でグレイコード(Gray Code)を生成するアルゴリズムと実装例
グレイコード(Gray Code)とは、隣り合う2つの値が必ず1ビットだけ異なるという性質を持つ二進数体系のことです。本記事では、コードのビット数を表す非負整数 n が与えられたときに、グレイコードの列を出力する方法を解説します。グレイコードの列は必ず 0 から始まる必要があります。例えば、入力が 2 の場合、出力は [0, 1, 3, 2] となります。これは、0 のグレイコードが 00、1 が 01、2 が 11、3 が 10 であるためです。隣接する値同士を比較すると、それぞれ1ビットしか変わっていないことが確認できます。解法のアプローチこの問題は、以下の手順で解くことができます。結果を
-
C++で算術数(約数の平均が整数になる数)を判定する方法
算術数とは算術数(Arithmetic Number)とは、その数のすべての正の約数の平均(相加平均)が整数になる数のことです。つまり、ある数 n について「約数の総和 ÷ 約数の個数」が割り切れる場合、その n は算術数であると定義されます。具体例で確認してみましょう。入力 : n = 6 出力 : YES 説明 : 約数は 1, 2, 3, 6 約数の総和 = 1 + 2 + 3 + 6 = 12 約数の個数 = 4 約数の総和 ÷ 約数の個数 = 12 / 4 = 3(整数なので算術数)なお、素数 p の場合、約数は 1 と p の2つだけなので平均は (1 + p) / 2 となります