解题思路:
因为考虑到兔子会休息,然后此时兔子的时间是不会增加的,只有乌龟的时间在增加
对于while循环里面的代码,应该都是可以看懂的,在兔子走过的路程s1-s2(乌龟走过的路程)<t 的时候
t1++, t2++;
s1 = v1*t1;
s2 = v2*t2;
当>=t的时候,兔子休息,兔子原地不动,乌龟继续前进,
t2 += s;
s1 = v1*t1; //t1时间没有增加,相当于原地不动
s2 = v2*t2;//前进了s秒的路程
当超过终点后,就跳出while循环
if (s1 < s2)cout << "T\n" << l / v2<< endl;
这里,乌龟走到了终点,乌龟赢,所以时间就是路程/速度=时间
else if (s1 == s2)cout << "D\n" <<t2<< endl;
//这里当同时到达终点的时候,因为同时到达,肯定是兔子有过休息的,所以兔子到达终点的话,时间肯定不是兔子的
如样例 10 5 5 2 20
第一秒过后,达到相差5的条件,此时,s兔 = 10,s龟 = 5,t兔=t龟 = 1秒
然后兔子休息后,t兔=1,t龟 = 3秒,此时s兔=10,s龟=15;
下一秒后,都同时达到终点,样例时间是算乌龟的时间,所以平局时间算乌龟的时间
else cout << "R\n" << t2 << endl;
为什么兔子赢了也还是乌龟消耗的时间呢?(这里乌龟并没有达到终点)
如输入 10 5 5 1 40
s兔 s龟 t1 t2
10 5 1 1
10 10 1 2 //休息
20 15 2 3
20 20 2 4 //休息
30 25 3 5
30 30 3 6 //休息
40 35 4 7
所以看出来,兔子自己是用了4秒跑到终点,但是中途休息的时间也是要算进去的
休息了3次,就是4+3=7,也就是兔子用的时间,但是此时达到终点后,乌龟虽然还没到终点
但是时间是和兔子的时间一样的,所以兔子赢了,时间也是t2
注意事项:
参考代码:
0.0分
22 人评分
// // 蓝桥杯题库 基础训练 龟兔赛跑预测 #include <cstdio> int v1, v2, t, s, L; // v1 兔子, v2 乌龟 int cur1 = 0, cur2 = 0; int main(){ scanf("%d%d%d%d%d", &v1, &v2, &t, &s, &L ); int time = 0; while (cur1 < L && cur2 < L){ if (cur1 - cur2 >= t){ // cur2 += v2 * s; // time += s; // 可能不需 s 秒 乌龟就到了 int tmp = 0; while (cur2 < L && tmp < s){ // 在兔子休息的时间内逐秒让乌龟前进 cur2 += v2; time++; tmp++; } if (cur2 >= L) break;
列公子 2020-02-09 11:57:25 |
} cur1 += v1; cur2 += v2; time ++; } if (cur1 >= L && cur2 >= L) printf("D %d", time); else if (cur1 >= L && cur2 < L) printf("R %d", time); else if (cur2 >= L && cur1 < L) printf("T %d", time); return 0; }
虽然距离差小于t,但如果兔子处于等待中,但兔子还是动弹不得呀
我不是张玉想 2019-10-31 22:17:24 |
而且题目说每一秒都要判断一次,那岂不是会出现每秒都要重新加S,就是等待时间置零,重新开始休息s秒吗,这个题目真的是
renqinghua 2020-02-18 15:11:58 |
他那个s只是一个赋值操作,并没有加,所以并没有问题啊
#include <bits/stdc++.h> using namespace std; int main() { int v1, v2, t, s, l; scanf("%d%d%d%d%d", &v1, &v2, &t, &s, &l); int t1 = 0, t2 = 0, s1 = 0, s2 = 0; while(s1 < l && s2 < l) { if(s1 - s2 < t) { t1++; t2++; s1 = v1 * t1; s2 = v2 * t2; } else { int tmp = 0; while(s2 < l && tmp < s) { //主要时这块,说不定不需要s秒,龟就已经到终点,这是兔子还在睡觉 t2++; tmp++; s2 = v2 * t2; } } } if(s1 == s2) printf("D\n"); else if(s1 < s2) printf("T\n"); else printf("R\n"); printf("%d\n", t2); return 0; }
input:10 3 20 15 3450 output: T 1150 这个数据 验证不对 你可以亲测
renqinghua 2020-02-18 15:10:43 |
我测对的啊
东星耀阳 2022-03-07 19:25:39 |
我的对
浅笑心柔 2023-03-13 20:22:17 |
那时间就是 l/v2