C++

 Computer >> コンピューター >  >> プログラミング >> C++
  1. C++で解く:パーティーの全員が好きなアイスクリームを受け取れるか判定する方法

    あるパーティーに、性質の異なる3つのグループの人々が参加するとします。1つ目のグループ: バタースコッチ味のアイスクリームしか好まず、他の味は一切食べません。2つ目のグループ: ストロベリー味だけが苦手で、それ以外の味はすべて好きです。3つ目のグループ: どんな味のアイスクリームでも喜んで食べます。ここで、1つ目のグループから x 人、2つ目のグループから y 人、3つ目のグループから z 人がパーティーに参加し、参加者全員が少なくとも1個は自分の好きなアイスクリームを受け取れなければなりません。一方、主催者が用意したアイスクリームは、バタースコッチ味が a 個、チョコレート味が b 個、スト

  2. C++で必要なドリンク詰め替えパックの数を計算する方法

    ある週にスタジアムで「a」回の試合と「b」回の記者会見が開催されるとします。スタジアムにはカフェテリアが2つあり、1つは選手用ロッカールーム内に、もう1つは記者会見エリアに設置されています。各カフェテリアにはソフトドリンクディスペンサーがあり、週の初めに補充しておく必要があります。 ロッカールームのディスペンサーは使用頻度が非常に高いため、「c」試合ごとに補充が必要です。一方、会見エリアのディスペンサーは「d」イベントごとに補充が必要です。スタジアム管理委員会は各週の初めに合計「k」個の詰め替えパックを発注でき、ロッカールーム用に「x」個、会見室用に「y」個を割り当てます。ただし、x + y

  3. 【C++】グリッド上のオブジェクトを発見するのに必要なスキャン回数を求めるコード

    ここでは、m × n のサイズを持つグリッドが与えられていると仮定します。あるオブジェクトがセル (ix, iy) に配置されており、開始位置 (sx, sy) からスキャンを実行して、このオブジェクトを発見することが目的です。スキャンのアルゴリズムは、グリッド上のセル (i, j) に位置しているとき、i 行目と j 列目全体をスキャンします。オブジェクトが見つかった時点でスキャンは終了し、まだ見つからない場合は、ポインタがセル (i + 1, j + 1) に移動して同じ要領で再度スキャンを行います。この処理を、オブジェクトが見つかるまで繰り返します。各位置情報が与えられたとき、アルゴリズ

  4. 【C++】名前の末尾から男性名・女性名を判定するプログラムの書き方

    問題概要配列 input に n 個の名前(文字列)が与えられたとします。この中から、各名前が男性名か女性名かを判定して出力するのが本記事の目的です。判定基準はとてもシンプルです。名前の末尾が「a」「e」「i」「y」のいずれかで終わっていれば女性名とみなし、それ以外は男性名と判断します。そして、すべての名前に対して「Male」または「Female」を出力します。たとえば、入力が n = 5、input = {Lily, Rajib, Thomas, Riley, Chloe} の場合、出力は「Female, Male, Male, Female, Female」となります。アルゴリズムの流れこ

  5. C++でどちらの数値が大きくなる確率が高いかを判定する方法

    問題概要 2つのk桁の整数 m と n が与えられているとします。それぞれの数値の桁をランダムにシャッフルした上で比較を行い、どちらの数値が大きくなる確率が高いかを判定します。 例えば、入力が n = 231、m = 337、k = 3 の場合、出力は「Second」になります。これは、2番目の数値(m = 337)の方が大きくなる確率が高いことを示しています。 解法のアプローチ この問題は、両方の数値を文字列として扱い、各桁を先頭から順番に比較することで解けます。具体的な手順は以下の通りです。 n と m をそれぞれ文字列 s1、s2 に変換します。 f(1番目の数値の桁が大きかった回数

  6. C++で物理実験の計算問題を解く方法

    ここでは、物理実験に関連する計算問題をC++で解く方法を紹介します。n組の値のペアと閾値kが与えられたとき、各ペアの1つ目の値を合計値aに加算し、2つ目の値を別の合計値bに加算します。その後、aと(k − a)のどちらが小さいかを判定し、同様にbについても判定します。最後に両方の最小値を足し合わせた結果を出力します。例えば、入力が n = 4、k = 20、values = {{3, 5}, {4, 3}, {2, 1}, {4, 4}} の場合、出力は14になります。解法の手順この問題を解くには、以下の手順に従います。a := 0, b := 0 for initialize i := 0,

  7. マンハッタン距離の中間点を求めるC++コードの解説

    2つの点 a = (x1, y1) と b = (x2, y2) が与えられたとき、2点間のマンハッタン距離は次のように定義されます。dist(a, b) = |x1 − x2| + |y1 − y2|ここで、点 a の座標を (0, 0)、点 b の座標を (x, y) とします。このとき、以下の2つの条件を同時に満たす点 c を求める必要があります。・dist(a, c) = dist(a, b) ÷ 2・dist(b, c) = dist(a, b) ÷ 2もし条件を満たす点が存在しない場合は、「-1 -1」を出力します。例として、入力が x = 13、y = 7 の場合、出力は「6 4

  8. C++でカードを捨てた後の最小合計を求める方法

    問題概要配列Tに5つの数値が格納されているとします。5枚のカードがあり、i番目のカードにはT[i]という数字が書かれています。一部のカードを捨てることができ、目的は残ったカードに書かれた数字の合計を最小化することです。ただし、同じ数字が書かれた2枚または3枚のカードを捨てる操作は、最大1回までしか行えません。同じ数字のカードを2枚または3枚選べない場合は、カードを捨てません。このとき、実現可能な最小の合計を求める必要があります。例えば、入力が T = [7, 3, 7, 3, 20] の場合、出力は 26 になります。これは「7」が書かれた2枚のカードを捨てることで、残りの合計が 3 + 3

  9. C++で要素を有効に塗り分けるための最小色数を求めるコード解説

    n 個の要素を持つ配列 A があるとします。この配列の要素を、次の条件を満たすように色で塗り分けることを考えます。どの色を選んでも、その色で塗られたすべての要素は、同じ色グループ内の最小値で割り切れること。使用する色の数はできるだけ少なくすること。与えられたすべての数を有効な方法で塗り分けるために必要な、最小の色の数を求めるのがこの問題です。例えば、入力が A = [10, 2, 3, 5, 4, 2] の場合、出力は 3 になります。1 番目の色で A[0] と A[3] を塗り、2 番目の色で A[2] を塗り、残りの 3 つの要素を 3 番目の色で塗ればよいからです。解法のアプローチこの

  10. C++でバッタがターゲットに到達できるかどうかを判定する方法

    長さ n の文字列 S と整数 k が与えられる問題を考えてみましょう。文字列には4種類の文字が含まれており、それぞれ複数のセル(マス)を表しています。バッタはジャンプを繰り返してターゲットに到達しようとしています。各文字の意味は以下の通りです。.: 対応するセルが空であることを表します#: 対応するセルに障害物があり、バッタはそこへジャンプできませんG: バッタの開始位置を表しますT: 目標となるターゲットのセルを表しますバッタは現在位置からちょうど k セル先にしかジャンプできません。このとき、バッタがターゲットに到達できるかどうかを判定する必要があります。例えば、入力が S = #G#T

  11. C++ですべての操作後の石の山の最小数を求める方法

    問題概要 n 文字の文字列 S が与えられます。各文字は + または - のいずれかです。ここに石の山があり、n 回にわたって「山から石を 1 個取り除く」か「山に石を 1 個追加する」という操作を行いました。ただし、石を取り除く操作の直前には、必ず山が空でない状態だったことが保証されています。i 番目の操作で石を取り除いた場合は S[i] = "-"、追加した場合は S[i] = "+" となります。 このとき、すべての操作を終えた後の石の山に残り得る石の数として考えられる最小値を求めてください。 たとえば、入力が S = "++-++&q

  12. 配列Aから隠れた配列Bを復元するC++コードの解説

    問題の概要n 個の要素を持つ配列 A が与えられ、同じサイズ n の隠れた配列 B が存在するとします。B の要素は正にも負にもなり得ます。各インデックス i(1 から n までの範囲)に対して、次の操作が実行された結果が配列 A に格納されています。まず A[i] を 0 に初期化するその後、B[i] を加算し、B[i+1] を減算し、さらに B[i+2] を加算する、という操作を交互に繰り返すつまり、A[i] = B[i] − B[i+1] + B[i+2] − B[i+3] + … という関係が成り立っています。このとき、元の配列 B を復元することが課題となります。例えば、入力が A

  13. 株式の売買後に所持金を最大化するC++プログラムの解説

    問題概要サイズnの配列Aとサイズmの配列B、そして整数rが与えられます。株を購入できる機会がn回あり、i番目の機会では1株あたりA[i]の価格で好きなだけ株を購入できます。同様に、株を売却できる機会がm回あり、i番目の機会では1株あたりB[i]の価格で好きなだけ株を売却できます。ただし、保有していない株を売ることはできません。初期所持金がrで保有株がゼロの状態からスタートし、売買を終えた時点での所持金の最大値を求めるのがこの問題の目的です。具体例入力が A = [4, 2, 5]、B = [4, 4, 5, 4]、r = 11 の場合を考えてみましょう。このときの出力は 26 になります。所持

  14. C++で解く:数値nから到達できる最小値を求めるゲーム問題

    数値 n が与えられます。ゲーム開始時点での n の値は v であり、プレイヤーは次の操作を0回以上繰り返し実行できます。操作: 正の整数 x(x < n かつ x が n の約数ではない)を選び、n から x を引く。プレイヤーの目標は、最終的な n の値を最小化することです。例えば、入力が n = 8 の場合、出力は 1 になります。最初の手番で x = 3 を選ぶと n は 5 になり、続いて x = 4 を選ぶことで n = 1 を達成できるためです。解法の考え方この問題は一見複雑に思えますが、実は非常にシンプルな規則性があります。n = 2 の場合: x < 2 を満たす

  15. 十分なキャンディーを渡せなくなった人を判定するC++プログラム

    2つの整数 a と b があるとします。a はアマル(Amal)が持っているキャンディーの数、b はビマル(Bimal)が持っているキャンディーの数を表します。まずアマルがビマルに1個のキャンディーを渡し、次にビマルがアマルに2個渡します。その後もアマルが3個、ビマルが4個というように、渡す個数を1個ずつ増やしながら交互にキャンディーを渡し合います。このやり取りは、どちらか一方が必要な個数を渡せなくなった時点で終了します。なお、相手から受け取ったキャンディーは自分の持ち分としては数えません。ここで、最初に正しい個数のキャンディーを渡せなくなるのが誰なのかを求める必要があります。例えば、入力が

  16. 配列の要素をdで割った後、正の数が配列サイズの半分以上になるようなdを求めるC++プログラム

    n個の要素からなる配列Aがあるとします。配列内のすべての数値を、ある非ゼロ整数dで割ったとき、結果として配列に現れる正の値の個数が配列サイズの半分以上になるようなdを見つけるのがこの問題です。条件を満たすdが複数存在する場合は、そのうちのどれか1つを返せば構いません。例として、入力が A = [10, 0, -7, 2, 6] の場合を考えてみます。n = 5 なので、除算後には少なくとも ⌈5/2⌉ = 3 個の要素が正である必要があります。d = 4 を選んだ場合、除算後の配列は [2.5, 0, -1.75, 0.5, 1.5] となり、正の数は 2.5、0.5、1.5 の3個あるため、

  17. ロボットが最終位置に到達するまでの最小ステップ数を求めるC++プログラム

    2つの座標 (x1, y1) と (x2, y2) があるとします。ロボットは現在点 (x1, y1) にいて、点 (x2, y2) へ移動したいと考えています。ロボットは1ステップごとに、周囲8方向(上下左右と斜め)の隣接するマスのいずれかに移動することができます。このとき、最終位置に到達するために必要な最小ステップ数を求めます。 例えば、入力が x1 = 3; y1 = 4; x2 = 6; y2 = 1; の場合、出力は 3 になります。その様子は以下の図の通りです。 解き方 この問題を解くには、次のステップに従います。 return max(|x2 - x1|, |y2 - y1|

  18. 連続する母音を削除して修正後のテキストを求めるC++コード

    文字列 S(n 文字)が与えられていると仮定します。あるテキストエディタには奇妙なルールがあり、その校正機能は次のように動作します。単語の中に母音が 2 つ連続して現れる限り、先頭側の母音を 1 つずつ削除していきます。連続する母音がなくなった時点で、その単語は「正しい」と判断されます。ここで母音として扱うのは、「a」「e」「i」「o」「u」「y」の 6 文字です。私たちの目的は、文字列 S にこの校正処理を適用した結果、つまり修正後の単語を求めることです。 例えば、入力が S = poor の場合、「o」が 2 つ連続しているため最初の「o」が削除され、出力は「por」になります。 解法

  19. 数直線上で出会う2人の疲労を最小限に抑えるC++コード

    問題の概要2つの整数 a と b が与えられます。2人の友人が数直線(OX軸)上の位置 x = a と x = b にそれぞれ立っており、各友人は直線に沿って任意の方向へ1ずつ移動できます(移動回数に制限はありません)。移動による疲労は次のルールで増加します。1回目の移動で疲労が1増え、2回目の移動で2増え、以降も同様に1ずつ増えていきます。2人はOX軸上の同じ整数点で会いたいと考えています。このとき、2人の疲労の合計が最小になる値を求めましょう。例えば、入力が a = 5、b = 10 の場合、出力は 9 になります。最適な移動方法の一つは次のとおりです。1人目の友人が右へ3歩、2人目の友人

  20. 三角数かどうかを判定するC++プログラム

    ある整数 n が与えられたとき、それが三角数であるかどうかを判定する方法を解説します。三角数とは、n 個の点(または球)を層状に積み重ねて正三角形を形作ることができる数のことです。具体的には、1, 3, 6, 10, 15, 21 … のように、k 番目の三角数は公式 T(k) = k × (k + 1) / 2 で表されます。例えば、入力が n = 10 の場合、10 は 4 番目の三角数(1 + 2 + 3 + 4 = 10)なので、出力は True になります。アルゴリズムの手順この問題を解くには、次の手順に従います。1 から n まで順に各値 i について調べます。i × (i + 1

Total 5990 -コンピューター  FirstPage PreviousPage NextPage LastPage CurrentPage:298/300  20-コンピューター/Page Goto:1 292 293 294 295 296 297 298 299 300