1 条题解
-
0
自动搬运
来自洛谷,原作者为

封禁用户
None搬运于
2025-08-24 21:17:53,当前版本为作者最后更新于2025-05-07 22:27:17,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
已修改部分细节 (错别字) 及排版 。
首先放上 AC 代码。
#include <bits/stdc++.h> using namespace std; long long gcd(long long a, long long b){ // 最大公约数 if(b == 0) return a; return gcd(b, a % b); // 用递归实现的最大公约数 } int main(){ long long l, v1, v2, t; cin >> l >> v1 >> v2 >> t; if(v1 < v2){ swap(v1, v2); } if(v1 == 0){ // 较快的一只青蛙速度是0,说明较慢的一只速度也为0 cout << 0 << endl; return 0; } if(v2 == 0){ // 较慢的一只青蛙速度是0,只需要考虑较快青蛙的速度 cout << ( v1 * t / l + 1) / 2 << endl; return 0; } long long sum= v1 + v2, subs = v1 - v2; // sum为和,subs为差 long long ans= (sum * t + l) / (2 * l)+(subs * t + l) / (2 * l); // 核心部分 long long d= gcd(v1, v2); if( (v2 / d % 2) != (v1 / d % 2)) // 一个数为奇数,另一个数为偶数的情况 ans -= (d * t+ l) / (2 * l); cout << ans << endl; return 0; }现在来看题目。
最初我审题时,认为这只是一道用顺序结构就能搞定的题目,即先算出在 秒内两只青蛙游的总路程(对应我的程序中的 ),再加上一次长度 ,因为第一次相遇两只青蛙游的路程和为 ,而接下来每一次相遇两只青蛙游的路程为 。最后,将 整除 ,再输出就可以了。
可这样做只能得到 60 分。
代码 :
#include <bits/stdc++.h> using namespace std; long long L,V1,V2,T,ans,sum; int main () { cin>> L >> V1 >> V2 >> T ; sum =(V1+V2)*T; ans= (sum+L) * 1.0 / (L * 2); cout<< ans; return 0; }接着再想一想,能不能优化一下呢 ?
我们可以将青蛙的速度 和 比大小 。 如果速度较快的青蛙速度是 , 那么我们就知道两只青蛙都没有动,输出
0即可。而如果较慢的青蛙速度是 ,我们就只需要计算较快的那只青蛙走的长度了 。同时,如果求出 和 的最大公约数(对应我的程序中的 ), 再利用 进行最常见的操作 , 就可以 AC 本题了 。
代码较乱,请见谅。如果我讲的那里不清楚,您可以在评论区问,我会经常看的。
- 1
信息
- ID
- 7700
- 时间
- 1000ms
- 内存
- 512MiB
- 难度
- 3
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者