Official

A - Don't be late Editorial by chokudai


高橋君が \(T\) 分後に到着出来るかどうかを求めるには、高橋くんが何分で到着出来るかを求めてしまえば、あとは比較をするだけで解くことが出来ます。

高橋君が到着するまでの時間は整数にはなりません。多くのプログラミング言語では、整数同士で割り算を行うと、小数部分が切り捨てられ、整数となります。今回の問題では、答えが切り捨てられててしまうと、例えば、D = 11, T = 5, S = 2などの場合において、正しい答えを得ることが出来ません。

ここで、double型などを使って小数として計算すると、今回の問題では誤差が出ないため、正しく解くことが出来ます。 (誤差についての説明は、回答例の下で行います)

回答例(C++)

#include <iostream>
using namespace std;

int main() {
	//入力を受け取る
	int D, T, S;
	cin >> D >> T >> S;

	//高橋君の移動時間を計算する
	double time = (double)D / S;

	//Tとtimeの大小関係に応じて出力をする
	if (T >= time) {
		cout << "Yes" << endl;
	}
	else {
		cout << "No" << endl;
	}
}


今回の問題で要求はされませんが、最終的に答えが整数になる場合でも、演算の途中で小数になってしまう場合には、答えが微妙にズレてしまう場合があります。

例えば、1÷3×3を計算しようとした時に、1÷3の時点で0.3333となり、それを3倍しても0.9999のようにしかならない、というイメージです。 (厳密な説明を知りたい場合は、「浮動小数点数」や「浮動小数点演算」で検索してみてください)

これを避けるために、普段から小数を使わない問題の解き方を覚えておくと、今後の問題が解きやすくなるかも知れません。

今回の問題では、高橋君が何分で到着出来るかではなく、高橋くんが\(T\)分で何メートル移動出来るかを求めてあげることで、割り算ではなく掛け算の演算となり、整数演算のみで問題を解くことが出来ます。移動できる距離がDメートル以上であれば、高橋君は待ち合わせに間に合うことが出来ます。

回答例(C++)

#include <iostream>
using namespace std;

int main() {
	//入力を受け取る
	int D, T, S;
	cin >> D >> T >> S;

	//高橋君の移動時間を計算する
	int dist = S * T;

	//Dとdistの大小関係に応じて出力をする
	if (dist >= D) {
		cout << "Yes" << endl;
	}
	else {
		cout << "No" << endl;
	}
}


posted:
last update: