2つのプレスの間で人が生き延びられる時間を求めるC++プログラム
本記事では、相向かって移動する2つのプレスの間で、人があとどれだけの時間生き延びられるかを計算するC++プログラムを紹介します。
問題の概要
4つの数値 d、L、v1、v2 が与えられます。
- 2つのプレスは、それぞれ初期位置 0 と L にあります。
- 2つのプレスは、それぞれ速度 v1 と v2 で互いに向かって移動します。
- 人の幅は d であり、2つのプレスの間隔が d よりも狭くなった時点で、人は押しつぶされてしまいます。
このとき、人が生きていられる時間(生存時間)を求める必要があります。
入力例
例えば、入力が次のようだったとします。
d = 1; L = 9; v1 = 1; v2 = 2;
この場合、出力は 2.6667 となります。
解き方の考え方
この問題は、物理的な距離と速度の関係を使うことで、シンプルな数式で解くことができます。
2つのプレスの初期間隔は L です。人が生き延びられるのは、間隔がちょうど d になる瞬間までです。つまり、2つのプレスが合わせて詰めなければならない距離は「L − d」になります。
2つのプレスは互いに向かって移動しているため、間隔が縮まる速さは両者の速度の合計「v1 + v2」となります。したがって、生存時間 e は次の式で求められます。
e := (L - d) / (v1 + v2) return e
C++での実装例
それでは、上記の考え方を実際のコードで確認してみましょう。
#include <bits/stdc++.h>
using namespace std;
float solve(int d, int L, int v1, int v2){
float e = (L - d) / (float)(v1 + v2);
return e;
}
int main(){
int d = 1;
int L = 9;
int v1 = 1;
int v2 = 2;
cout << solve(d, L, v1, v2) << endl;
}入力
1, 9, 1, 2
出力
2.66667
実装のポイント
- 整数除算の回避: C++では整数同士の除算は小数点以下が切り捨てられるため、
(float)(v1 + v2)のように片方を float 型へキャストすることで、正確な小数結果を得ています。 - 戻り値の型: 結果が小数になる可能性があるため、関数の戻り値は
float型としています。
このように、一見複雑そうな問題でも、距離・速度・時間の基本的な関係式に落とし込めば、O(1) の計算量で効率よく解くことができます。
-
C++のSTLを使って2つの配列の共通要素を求める方法
このチュートリアルでは、C++のSTL(標準テンプレートライブラリ)を使用して、2つの配列に共通する要素を見つける方法について解説します。2つの配列の共通要素を求めるには、set_intersection()メソッドを使用します。この関数は、あらかじめソートされた2つの範囲を受け取り、双方に存在する要素だけを出力先のコンテナへコピーします。そのため、呼び出し前に必ずsort()などで配列を昇順に並べておく必要があります。サンプルコード#include <bits/stdc++.h> using namespace std; int main(){ // 配列の定義
-
C++で1からnまでの素数の積を求める方法
数値 n が与えられたとき、1 から n までの範囲に含まれる素数をすべて掛け合わせた積を求めることを考えます。例えば n = 7 の場合、素数は 2・3・5・7 なので、出力は 2 × 3 × 5 × 7 = 210 となります。アプローチ:エラトステネスの篩この問題を効率的に解くには、エラトステネスの篩(ふるい)と呼ばれる古典的なアルゴリズムを使います。この手法では、2 から始めて各素数の倍数を順に除外していくことで、1 から n までのすべての素数を高速に見つけることができます。その後、見つかった素数をすべて掛け合わせれば答えが得られます。アルゴリズムの手順サイズ n+1 の真偽値配列を