ブルーブリッジカップの道を予測するためのブルーブリッジカップの基本的な演習

試験問題の基本的な練習の予測

この世にはいろいろな種類のうさぎや亀がいるといわれていますが、調査の結果、すべてのうさぎと亀には、人種のような共通の特徴があることがわかりました。そのため、カメとウサギの種族は常に世界のあらゆる場所で発生しています。Xiaohuaはこれに非常に興味があるので、さまざまなウサギとカメの種族を研究することにしました。彼は、ウサギはカメよりも速く走るが、よく知られている問題を誇りにして怠惰であることを発見したので、カメとのゲームでは、ウサギが1秒後にtメートル以上先にくると、止まります。 s秒間休憩します。さまざまなウサギでは、tとsの値は異なりますが、すべてのカメは同じです。それらは最後まで止まりません。
  ただし、一部のゲームは非常に長く、プロセス全体を監視するには時間がかかります。Xiaohuaは、各ゲームの開始後にウサギとカメのデータが記録されている限り、ウサギの速度はv1です(つまり、ウサギは毎秒v1メートル走ることができます)。速度v2、対応するウサギのt、s値、およびトラックの長さl-は、ゲームの結果を予測できます。しかし、Xiaohuaは怠惰で、手計算でゲームの結果を推測したくなかったので、清華大学のコンピューター学部の高レベルの学生に助けを求められたので、ゲームデータv1の入力用のプログラムを作成してくださいv2、t、s、l、ゲームの結果を予測します。
入力形式の
  入力は1行のみで、スペースで区切られた5つの正の整数v1、v2、t、s、lを含みます。ここで、(v1、v2 <= 100; t <= 300; s <= 10; l <= 10000およびこれはv1とv2の公倍数です。
出力形式に
  は2行が含まれます。最初の行は一致結果を出力します。大文字の「T」、「R」、または「D」は、亀が勝った、ウサギが勝った、または両方が同時に到着したことを意味します終わり。
  2行目は正の整数を出力し、勝者(または両方)がフィニッシュラインに到達するまでの時間(秒単位)を示します。
サンプル入力
10 5 5 2 20
サンプル出力
D
4
サンプル入力
10 5 5 1 20
サンプル出力
R
3
サンプル入力
10 5 5 3 20
サンプル出力
T
4

アイデア:
質問で与えられた条件から、カメの時間は固定されており、ウサギの時間だけが不確実であると結論付けることができます。固定距離に従ってウサギの時間を決定する方法は?逆の考え方で考えられますが、うさぎの時間に応じて距離をどのように決めるのですか?

1.最初のアイデアは非常に単純です。つまり、ウサギとカメの時間は同じであると仮定します。つまり、ウサギが終点を通過したかどうかに関係なく、カメが終点に到達する前に、ウサギが同時にカメを超える距離を比較することにより、タイトルの動作規則に従います。 sumは、目標を達成するために停止するか続行するかを決定します。タートルがフィニッシュラインに到達したときにsum> 0の場合、ウサギは遠くまで走り、ウサギが勝ち、sum == 0、同じ距離で同時に勝ち、sum <0の場合、タートルが勝ちます。ただし、この方法の欠点は、ウサギが運動する時間を個別に計算する必要があることです。
2.通常の考え方は、ウサギの時間を直接計算し、サイクルを通じて最終結果を計算することです(ただし、2つの間の距離が距離よりも短い場合)。

#include<bits/stdc++.h>

using namespace std;

int main() {
	int v1,v2,t,s,l;
	cin >> v1 >> v2 >> t >> s >> l;
	int t1,t2,l2;
	t2 = l / v2;
	int v = v1 - v2;
	int sum = 0;
	for (int i = 0; i < t2; i++) {
		sum += v;
		l2 += v1;
		t1 ++;
		if(l2 > l){
			break;
		}
		if(sum >= t){
			i += s;
			t1 += s;
			sum = sum - (min(s,t2 - i - 1)) * v2;
		}			
	}
	if (l2 < l) {
		while(l2 < l) {
			l2 += v1;
			t1 += 1;
		}
	}
	if (t2 == t1){
		cout << "D" << endl << t2 << endl;
	}
	else if (t2 < t1) {
		cout << "T" << endl << t2<< endl;
	}
	else {
		cout << "R" << endl << t1<< endl;
	} 
	return 0;
} 

上記は最初の方法で、結果は大丈夫です。なぜいくつかの提出物があるのか​​わかりません(出力はまったく同じです!)、それは少し不思議です(あなたが大物を理解しているなら訂正してください、私は感謝しています!)、それで私は2番目に変更しましたメソッドは次のとおりです。

#include<bits/stdc++.h>

using namespace std;

int main() {
	int v1,v2,t,s,l;
	cin >> v1 >> v2 >> t >> s >> l;
	int t1 = 0, t2 = 0, l1 = 0, l2 = 0;
	while(l1 < l && l2 < l){
        if(l1 - l2 >= t){
            t2 += s;
            l1 = t1 * v1;
            l2 = t2 * v2;
        }
        else{
            t1++;
            t2++;
            l1 = t1 * v1;
            l2 = t2 * v2;
        }
    }
	if (l1 == l2){
		cout << 'D' << endl << t2;
	}
	else if (l1 < l2) {
		cout << 'T' << endl << l/v2;
	}
	else {
		cout << 'R' << endl << t2;
	} 
	return 0;
} 
元の記事を4件公開 賞賛3件 訪問数78件

おすすめ

転載: blog.csdn.net/HERODING23/article/details/105594550