3本の棒で三角形を作るために必要な最小の分数を求めるC++プログラム
ここに3つの整数 a、b、c があるとします。それぞれの長さが a、b、c である3本の棒があり、1分ごとに好きな棒を1本選んで長さを1cmずつ伸ばすことができます。ただし、棒を折ったり切ったりすることはできません。このとき、3本の棒で三角形を形成できるようにするために必要な最小の分数を求めます。
問題例
たとえば、入力が a = 2、b = 3、c = 5 の場合、出力は 1 になります。a または b のどちらか一方を1だけ伸ばせば、(a + b) > c という条件を満たす三角形を作ることができるためです。つまり、わずか1分で十分ということになります。
解き方・アルゴリズムの手順
三角形の成立条件より、最も短い2本の辺の和が、最も長い辺よりも大きくなければなりません。そこで、次の手順で問題を解くことができます。
配列 A = { a, b, c } を定義する
配列 A を昇順にソートする
max(A[2] - A[1] - A[0] + 1, 0) を返すソート後、A[2] が最長の辺となります。もし A[1] + A[0] がすでに A[2] より大きければ、追加の操作は不要なので 0 を返します。そうでなければ、条件を満たすまでに不足している「A[2] - A[1] - A[0] + 1」分の時間が必要です。
実装例
理解を深めるために、以下のC++による実装を見てみましょう。
#include <bits/stdc++.h>
using namespace std;
int solve(int a, int b, int c) {
vector<int> A = { a, b, c };
sort(A.begin(), A.end());
return max(A[2] - A[1] - A[0] + 1, 0);
}
int main() {
int a = 2;
int b = 3;
int c = 5;
cout << solve(a, b, c) << endl;
}入力
2, 3, 5
出力
1
-
サイズ d の正十二角形を作れる組み合わせの数を求める C++ プログラム
問題概要 整数 d が与えられたとします。ここで、一辺の長さが 1 の正方形タイルと正三角形タイルが無限枚あるものと考えます。これらのタイルを組み合わせて、一辺の長さが d の正十二角形(12 辺形)を作るとき、その作り方が何通りあるかを求めるのがこの問題です。答えが非常に大きくなる場合は、998244353 で割った余りを返します。 アプローチ この問題は、二項係数を利用することで効率的に解くことができます。結論から言うと、求めるべき答えは C(2d−1, d−1)、すなわち「2d−1 個の中から d−1 個を選ぶ組み合わせの総数」です。 階乗を直接計算すると値が急激に大きくなりオーバー
-
長さMのパスワードをN個生成するC++プログラムの書き方
本記事では、指定した長さMのパスワードをN個生成するC++プログラムを紹介します。まず rand() 関数を使ってランダムな数字列を生成し、その後、順列(パーミュテーション)アルゴリズムによって、その数字列のすべての並び替えパターンをパスワード候補として出力します。 アルゴリズム プログラム全体の処理の流れは、以下の擬似コードのとおりです。 開始 パスワードの長さを入力として受け取る。 関数 permutation() がランダムなパスワードを生成する。 /* 引数 ポインタ配列 a 乱数の総数 m パスワードの長さ s */ // 関数本体: