C++
 Computer >> コンピューター >  >> プログラミング >> C++

C++で同じジャンプ回数の後に2人が出会えるかどうかを判定する方法

問題概要

この問題では、2人のスタート地点と1回あたりのジャンプ距離を表す4つの整数が与えられます。求めるのは、同じジャンプ回数の時点で2人が同じ位置に出会うことができるかどうかの判定です。

具体的には、それぞれ点p1とp2からスタートし、1回のジャンプでj1とj2だけ進む2人が、ジャンプを繰り返す過程のどこかで同じ位置に到達しうるかを確認します。

例で理解しよう

入力: p1 = 5, p2 = 9, j1 = 4, j2 = 2

出力: Yes

説明:

  • 1回目のジャンプ後: p1 = 9、p2 = 11
  • 2回目のジャンプ後: p1 = 13、p2 = 13

2回目のジャンプの後、両者がともに位置13に達しており、ここで初めて出会っていることがわかります。

解法のアプローチ

2人がどこかの時点で出会うためには、後ろにいる人の方が、より長いジャンプができなければなりません。出会いが可能かどうかを判定するには、次の条件を確認します。

  • p1 > p2 の場合(1人目が前方にいる場合)、j1 < j2 である必要がある
  • かつ、((p2 − p1) % (j1 − j2)) == 0 が成り立つこと

これらの条件がすべて満たされれば出会いは可能です。そうでなければ、2人が出会うことはありません。

この条件の意味を少し詳しく見てみましょう。n回のジャンプ後に2人が同じ位置にいるということは、p1 + n×j1 = p2 + n×j2 が成り立つということです。これを変形すると n = (p2 − p1) / (j1 − j2) となります。したがって、出会いのタイミングが整数回のジャンプで訪れるためには、初期位置の差(p2 − p1)がジャンプ距離の差(j1 − j2)で割り切れなければならないのです。

ソリューションの実装例

#include<iostream>
using namespace std;

bool WillMeet(int p1, int j1, int p2, int j2){

    return ( (j1 > j2 && ( ((p2 - p1) % (j1 - j2)) == 0)) || (j2 > j1 && ( ((p1 - p2) % (j2 - j1)) == 0)) );
}

int main() {
    
    int p1 = 5, j1 = 4, p2 = 9, j2 = 2;
    if(WillMeet(p1, j1, p2, j2))
        cout<<"Both will meet at some point";
    else
        cout<<"Both will not meet at any point";
    
    return 0;
}

出力

Both will meet at some point

コードの解説

関数WillMeetは、次の2つのケースをチェックしています。

  • j1 > j2 の場合: 1人目のジャンプ距離が大きいため、1人目が後方にいれば追いつける可能性があります。(p2 − p1)が(j1 − j2)で割り切れるかどうかを確認します。
  • j2 > j1 の場合: 今度は2人目が追いつくケースとして、(p1 − p2)が(j2 − j1)で割り切れるかどうかを確認します。

どちらかの条件が成立すればtrueを返し、main関数ではその結果に応じて「2人はどこかで出会う」「2人は決して出会わない」という判定結果を出力します。

  1. 数値が2の累乗かどうかを判定するC++プログラムの書き方

    与えられた数値が2の累乗(べき乗)であるかどうかを判定する方法を紹介します。まず、どのような数が2の累乗に該当するのかを確認しておきましょう。基本的な考え方は、数値が偶数である間は繰り返し2で割り続け、最終的に1になれば2の累乗、それ以外の場合は2の累乗ではないと判定するというものです。よりスマートな判定方法としては、数値の対数(log)を取る方法があります。底を2とした対数の計算結果が整数であれば、その数は2の累乗であり、整数でなければ累乗ではありません。2の累乗となる数は以下の通りです。2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048 ...22

  2. 【Python】2つの異なる都市へ同じ人数を送るときの最小コストを求めるプログラム

    リスト costs があるとします。costs[i] は [c1, c2] という形式で表され、人 i が都市0へ移動するのに c1 のコストがかかり、都市1へ移動するのに c2 のコストがかかることを意味します。ここで、都市0と都市1へ同じ人数ずつ送りたい場合に必要な最小コストを求めるのがこの問題です。たとえば、入力が costs = [[2, 6], [10, 3], [4, 9], [5, 8]] のとき、出力は 17 になります。これは、人0と人2を都市0へ、人1と人3を都市1へ割り当てると、都市0側のコストが 2 + 4 = 6、都市1側のコストが 3 + 8 = 11 となり、合計