C++で本の未読の章の数を数える方法
ペアの配列 P があるとします。P[i] は (l, r) の形式で表され、これに加えて数値 k が与えられます。ここで、n 個の章からなる本を読んでいる状況を考えます。本の各ページは必ずいずれか一つの章にのみ属し、各章は少なくとも1ページ以上を含みます。すでにいくつかのページを読んでおり、ページ番号 k が「まだ読んでいない最初のページ」を示しています。このとき、まだ完全に読み終えていない章の数を求める必要があります。P[i] は各章のページ番号の範囲を表します。
例えば、入力が P = [[1, 3], [4, 7], [8, 11]]; k = 4 の場合、出力は 2 になります。これは、第1章をすでに読み終えており、残りの2章がまだ読まれていないためです。
解決手順
この問題を解くには、以下の手順に従います。
n := P のサイズ i := 1 で初期化し、i <= n の間、i を1ずつ増やしながら繰り返す: k >= P[i - 1, 0] かつ k <= P[i - 1, 1] の場合: return n - i + 1 return 0
このアルゴリズムのポイントは、ページ k が属する章を線形探索で見つけることです。k は最初の未読ページであるため、それより前の章はすべて読み終えており、k を含む章から最後の章までは未読のままです。したがって、見つかった章の位置から残りの章数 n - i + 1 を返せば答えが求まります。該当する章が見つからない場合は、すべての章を読み終えているため 0 を返します。
実装例
理解を深めるために、以下の実装例を見てみましょう。
#include <bits/stdc++.h>
using namespace std;
int solve(vector<vector<int>> P, int k){
int n = P.size();
for (int i = 1; i <= n; i++){
if (k >= P[i - 1][0] && k <= P[i - 1][1])
return n - i + 1;
}
return 0;
}
int main(){
vector<vector<int>> P = { { 1, 3 }, { 4, 7 }, { 8, 11 } };
int k = 4;
cout << solve(P, k) << endl;
}
入力
{ { 1, 3 }, { 4, 7 }, { 8, 11 } }, 4
出力
2
-
【C++】長方形に含まれる正方形の総数を求めるアルゴリズムと実装
縦の長さL、横の幅B(L≥B)の長方形が与えられたとします。この記事では、L×Bの長方形の中にいくつの正方形が含まれているかを効率的に求める方法を解説します。 上の図は3×2の長方形の例です。この長方形には、2×2の正方形が2個、1×1の正方形が6個含まれています。 合計:6+2=8個 規則性を見つける まず、正方形だけで構成されたB×Bの図形について考えてみましょう。 サイズL×Bの長方形には、必ずL×B個の1×1の正方形が含まれます。 含まれる最大の正方形のサイズはB×Bです。 L=B=1の場合:正方形の数=1 L=B=2の場合:正方形の数=1+4=5(2×2が1個、1×1が4個) L
-
C++で階乗の桁数を数える方法をわかりやすく解説
本記事では、整数値が与えられたときに、まずその数の階乗を計算し、次にその結果に含まれる桁の総数を求める方法について解説します。階乗とは何か階乗とは、ある数から1ずつ減らしながらすべての値を掛け合わせて計算される数です。記号は「!」で表され、0!、1!、2!、3!、5!などのように書きます。なお、0!と1!は常に1となります。例:2の階乗 = 2 × (2−1) = 2 × 1 = 2 3の階乗 = 3 × (3−1) × (2−1) = 3 × 2 × 1 = 6具体例入力 − factorial(6)出力 − factorial(6)の桁数:3解説 − 6の階乗は720であり、3桁の数字で