-
C++で隣接要素が互いに割り切れない昇順配列を生成する方法
整数 n が与えられたとします。ここで、n 個の要素からなる配列 A を作成することを考えます。配列 A は次の条件を満たす必要があります。A は昇順にソートされているすべての要素は互いに異なる(重複がない)インデックスを 1 から始めた場合、2 ≤ i ≤ n を満たすすべての i について、A[i] が A[i-1] で割り切れない例えば、入力が n = 7 の場合、出力は [2, 3, 4, 5, 6, 7, 8] となります。解法のアプローチこの問題は実は非常にシンプルです。2 から n+1 までの連続する整数をそのまま並べるだけで条件を満たす配列が得られます。連続する整数において、大
-
C++で本の未読の章の数を数える方法
ペアの配列 P があるとします。P[i] は (l, r) の形式で表され、これに加えて数値 k が与えられます。ここで、n 個の章からなる本を読んでいる状況を考えます。本の各ページは必ずいずれか一つの章にのみ属し、各章は少なくとも1ページ以上を含みます。すでにいくつかのページを読んでおり、ページ番号 k が「まだ読んでいない最初のページ」を示しています。このとき、まだ完全に読み終えていない章の数を求める必要があります。P[i] は各章のページ番号の範囲を表します。 例えば、入力が P = [[1, 3], [4, 7], [8, 11]]; k = 4 の場合、出力は 2 になります。これ
-
【C++】軍隊の階級aから階級bへ昇進するのに必要な年数を計算する方法
問題の概要要素数が n-1 の配列 D と、2つの値 a および b が与えられます。ある軍隊には、1 から n まで番号が付けられた n 個の階級が存在し、階級 i から階級 i+1 に昇進するには D[i] 年かかります。Amal(アマル)は階級 a に到達したばかりですが、彼の目標は階級 b に到達することです。そこで、目標を達成するまでに必要な年数を求めましょう。例えば、入力が D = [5, 6]、a = 1、b = 3 の場合、出力は 11 になります。これは、階級1から2への昇進に5年、階級2から3への昇進に6年かかるため、合計 5 + 6 = 11 年となるからです。解決のため
-
C++でレビュー投票の結果と不確実性を判定するコード
問題の概要3つの整数 x、y、z が与えられます。あるレビューサイトでは、x 人が賛成票(アップ投票)を、y 人が反対票(ダウン投票)を投じることが確定しており、さらに z 人が投票予定ですが、彼らが賛成票を投じるのか反対票を投じるのかは不明です。各人は最大1回しか投票できません。賛成票が反対票より多ければ結果は「+」、反対票が多ければ「-」、同数であれば「0」となります。しかし、投票先が不明な z 人が存在するため、結果が1通りに確定しないケースがあります。z 人の投票の仕方に2通り以上の異なるシナリオが存在するとき、結果は不確実(「?」)とみなされます。この問題では、結果を求めるか、不確実
-
指定された条件を満たす2つの整数を求めるC++プログラムの解説
数値 x が与えられたとき、以下の条件をすべて満たす2つの整数 a と b を見つける問題を考えてみましょう。a と b はどちらも 1 以上 x 以下の範囲内にあるa は b で割り切れる(a % b == 0)a × b > x が成り立つa ÷ b < x が成り立つ条件を満たす組み合わせが存在しない場合は -1 を返します。例えば x = 10 の場合、出力は 6 と 3 になります(他の組み合わせも正解となり得ます)。シンプルな解法のポイントこの問題は実は非常にシンプルな解法があります。それは a = x、b = x とすることです。この選択が条件を満たすことを確認してみ
-
与えられた仮説を反証する数を見つけるためのC++コード
正の整数 n が与えられたとします。ここで、「ある正の整数 n が存在し、任意の正の整数 m に対して (n・m + 1) が常に素数となる」という仮説を考えます。この仮説が誤りであることを証明するには、反例となる m を見つける必要があります。 例えば、入力が n = 12 の場合、出力は 10 になります。これは 12 × 10 + 1 = 121 が素数ではないためです(121 = 11 × 11 と素因数分解できるからです)。 解法のアプローチ この問題は、以下のシンプルな手順で解くことができます。 n が 3 未満の場合:n + 2 を返す それ以外の場合:n - 2 を返す i
-
C++で3つの石の山から取得できる最大の石の数を求めるアルゴリズム
3つの整数 a、b、c が与えられ、それぞれの数に対応する石の山が3つあるとします。この状態で、以下の2種類の操作を繰り返し実行できます。1つ目の山から1個、2つ目の山から2個の石を取り出す(各山に十分な石が残っている場合)2つ目の山から1個、3つ目の山から2個の石を取り出す(各山に十分な石が残っている場合)このとき、合計で最大何個の石を集められるかを求めるのが本問題です。具体例例えば、a = 3、b = 4、c = 5 が入力として与えられた場合、出力は 9 になります。手順は以下の通りです。まず「2つ目の山から1個、3つ目の山から2個」の操作を2回実行すると、2つ目の山から2個、3つ目の山
-
数字を削除した後にx番目の要素を見つけるC++コード
2つの整数 n と x が与えられているとします。黒板には最初の n 個の自然数(1 から n まで)が書かれています。i 番目(i は 1 から開始)の操作では、黒板に残っている数列のうち i 番目の数を削除していきます。そして、残りの数が i 個未満になった時点で削除作業を停止します。このとき、最終的に残った数列の x 番目の数を求めるのが問題です。例えば、入力が n = 69、x = 6 の場合、出力は 12 になります。最初の操作では i = 1 なので 1 を削除します。続く2番目の操作では i = 2 ですが、この時点で数列は 2, 3, 4, … となっているため、2番目の数であ
-
ラッキー数字がk個以下の整数を数えるC++プログラムの解説
要素数nの配列Aと整数kが与えられた場面を考えてみましょう。「ラッキーナンバー」とは、10進表現において幸運な数字とされる「4」と「7」だけで構成される正の整数のことです。この記事では、配列Aに含まれる各整数のうち、ラッキー数字(4または7)の出現回数がk個以下であるものがいくつあるかを求める方法を解説します。例えば、入力が A = [44, 74, 474, 154]、k = 2 の場合、出力は3になります。44はラッキー数字を2つ持ち、74も2つ持つため条件を満たします。一方、474はラッキー数字を3つ持つためk=2を超えており、対象外です。また、154はラッキー数字を1つしか含まないため
-
クライアントからの着信時に処理すべき注文数をカウントするC++プログラム
3つの整数 n、m、z があるとします。あるオフィスでは、n 分ごとにクライアントから電話がかかってきて、m 分ごとに新しい注文(配達)が届きます。オフィスは合計 z 分間営業しています。ここで求めたいのは、クライアントからの電話がかかった時点で未処理の注文が残らないようにするために、最低限いくつの注文を処理する必要があるかという数です。なお、注文を受け取る作業も、クライアントとの通話も、それぞれちょうど1分かかるものとします。例えば、入力が n = 1、m = 2、z = 5 の場合、出力は 2 になります。これは、2分目と4分目に届いた注文を処理すればよいからです。解法の考え方この問題を解
-
C++ですべての電球を点灯できるかどうかを判定する方法
この記事では、m個の電球とn個のスイッチが与えられたとき、すべての電球を点灯できるかどうかを判定するC++プログラムを紹介します。 問題の概要 数値 m と、n 個のサブリストからなるネストされたリスト A があるとします。全部で m 個の電球があり、初期状態ではすべて消えています。n 個のスイッチが存在し、それぞれがいくつかの電球に接続されています。A[i] は「i 番目のスイッチを押すことで点灯できる電球の集合」を表します。このとき、すべての電球を点灯できるかどうかを確認する必要があります。 例えば、入力が A = [[1, 4], [1, 3, 1], [2]]、m = 4 の場合、出力
-
【C++】数値nを表すときに使う「異なる桁」の種類を最小にする方法
ある整数 n が与えられたとします。この n を、0 以外の桁(1〜9)の和として分解することを考えます。その際、「使用する異なる数字の種類数」が最小になるような解を見つけるのが本記事のテーマです。 例えば入力が n = 13 の場合、出力は次のようになります。 [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] これは「1」を 13 個並べたものです。合計は 13 となり、使用している数字は「1」の 1 種類だけなので、種類数の観点で最適な解となります。 解法のアプローチ この問題は非常にシンプルです。少なくとも 1 種類の数字は必ず必要となるため、1 種類だけ
-
C++でn日後の木の高さを求めるアルゴリズムと実装コード
問題概要n個の要素を持つ配列Aがあるとします。Aの各要素は0または1の値を取ります。ここに一本の木があり、連続するn日間について、A[i]が0の場合はその日に水やりを行わず、1の場合は水やりを行うものとします。木は以下のルールに従って成長します。2日連続で水やりが行われないと、木は枯れてしまいますi日目に水やりをすると、木は1cm成長しますi日目と(i+1)日目に連続して水やりをした場合は、1cmの代わりに5cm成長しますi日目に水やりをしなかった場合は、木は成長しません最初、木の高さは1cmです。n日後の木の高さを求めてください。ただし、木が枯れてしまった場合は-1を返します。例えば、入力が
-
コーディングコンテスト後の学生の順位を求めるC++プログラム
問題概要 n個の要素からなる配列Aがあるとします。あるコーディングコンテストには合計n人の学生が参加し、開始前の時点で全員が正の整数のレーティングを持っています。A[i]はi番目の学生のレーティングを表します。コンテスト終了後、すべての学生はそれぞれ正の整数の順位に着くことになります。学生はレーティングに応じて順位が決まり、学生Aのレーティングが学生Bより厳密に低い場合、Aの順位はBより厳密に大きい(下位の)番号になるとします。ここで、コンテスト終了時の各学生の順位を求めます。 例として、入力がA = [3, 5, 3, 4, 5]である場合を考えてみましょう。このとき出力は[4, 1, 4
-
フィボナッチ数列の位置に「O」を含む名前を生成するC++コードの解説
数値 n が与えられたとします。Amal はペットに名前を付けようとしており、あるアルゴリズムに従って名前を決定します。名前の長さは n 文字で、大文字の「O」と小文字の「o」のみで構成されます。アルゴリズムのルールは次のとおりです。名前の i 番目の文字は、i がフィボナッチ数列に含まれる場合は大文字の「O」、それ以外の場合は小文字の「o」となります。名前の文字は 1 から n までの番号が付けられています。例えば、入力が n = 10 の場合、出力は「OOOoOooOoo」になります。これは、フィボナッチ数列の最初の数値が 1、2、3、5、… であるためです。解法のアプローチこの問題を解く
-
【C++】d日以内に最初の山へ集められる干し草の俵の最大数を求めるアルゴリズム
問題概要 n個の要素を持つ配列Aと値dが与えられます。ある農家では、n個の干し草の山が一列に並べられており、i番目の山にはA[i]個の干し草が積まれています。 ここに1頭の牛がいて、1日に1回だけ、どれかの山から隣接する山へ干し草を1つ移動させることができます(何もしない日があっても構いません)。牛はd日間で1番目の山の干し草の数をできるだけ多くしたいと考えています。d日後の1番目の山にある干し草の最大数を求めてください。 例えば、入力が d = 5、A = [1, 0, 3, 2] の場合、出力は 3 になります。これは次のような手順で移動できるためです。 1日目:3番目の山 → 2番目の
-
C++とGo言語の違いとは?特徴・メリット・デメリットを徹底比較
C++とGoはどちらも広く利用されているプログラミング言語ですが、設計思想や得意分野は大きく異なります。本記事では、それぞれの言語の概要、特徴、メリット・デメリットを整理し、両者の主な違いを比較表を使って分かりやすく解説します。 Go言語とは Goは、Googleのエンジニアによって開発されたオープンソースのプログラミング言語です。高速なコンパイル、ガベージコレクション、強力な静的型付け、そして並行処理プログラミングへの明示的なサポートを特徴としています。 開発は2007年、Rob Pike、Robert Griesemer、Ken Thompsonの3名によって開始されました。ライセンスは
-
C++で行列(マトリックス)内の全要素数を求める方法
ここでは、n行 × m列の行列が与えられたとき、その中に含まれる要素の総数を求める方法を解説します。計算した結果は、出力として表示します。例えば、入力が n = 20、m = 15 の場合、出力は 300 になります。考え方と手順行列の各行には m 個の要素が含まれており、それが n 行分並んでいるため、要素の総数は単純に行数と列数を掛け合わせるだけで求められます。この問題を解くための手順は以下の通りです。行数 n と列数 m を受け取る「n × m」を計算して返すreturn n * m;実装例理解を深めるために、以下のC++による実装例を見てみましょう。#include <bits/
-
C++で配列内の偶数を1減らすプログラムの書き方
ここでは、正の整数が格納されたサイズ n の配列 arr が与えられた場合を考えます。配列の中から偶数を見つけ出し、それらをすべて 1 減らす処理を行い、処理後の配列を出力します。 例えば、入力が n = 7、arr = {10, 9, 7, 6, 4, 8, 3} の場合、偶数である 10, 6, 4, 8 がそれぞれ 1 減らされ、出力は「9 9 7 5 3 7 3」となります。 解法のアプローチ この問題は非常にシンプルで、以下の手順で解くことができます。 配列の先頭から末尾まで、各要素を順番に走査します。 現在の要素を 2 で割った余りが 0(つまり偶数)であれば、その要素を 1 減
-
2行×n列のグリッドでロボットがゴールに到達できるか判定するC++コード
問題の概要2行・n列のグリッドが与えられます。ロボットはグリッド上の位置 (0, 0) におり、現在位置から上下左右および斜め(角)に隣接するセルへ移動しながら、(1, n − 1) のセルを目指します。グリッドは文字列の配列として渡され、各セルは次のように表されます。# … ブロックされていて通行できないセル. … 通行可能なセルこのとき、ロボットが (0, 0) から出発して (1, n − 1) に到達できるかどうかを判定します。例えば、入力が n = 4、grid = {.##., ....} の場合、出力は「Possible(到達可能)」となります。解法の考え方この問題は、以下の手順