洛谷B4213题解(因排版问题被打回)

题解:
已修改部分细节 (错别字) 及排版 。

**首先放上 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;
}

** 现在来看题目 。**

最初我审题时 , 认为这只是一道用顺序结构就能搞定的题目 , 即先算出在 $T$ 秒内两只青蛙游的总路程 (对应我的程序中的 $sum$), 再加上一次长度 $L$, 因为第一次相遇两只青蛙游的路程和为 $L$, 而接下来每一次相遇两只青蛙游的路程为 $2L$。 最后,将 $sum$ 整除 $2L$ , 再输出就可以了。

可这样做只能得到 60 分 。

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;
}

接着再想一想 , 能不能优化一下呢 ?

我们可以将青蛙的速度 $V_1$ 和 $V_2$比大小 。 如果速度较快的青蛙速度是 $0$ , 那么我们就知道两只青蛙都没有动 , 输出 0 即可。而如果较慢的青蛙速度是 $0$, 我们就只需要计算较快的那只青蛙走的长度了 。

同时 , 如果求出 $V_1$ 和 $V_2$ 的最大公约数 (对应我的程序中的 $d$), 再利用 $d$ 进行最常见的操作 , 就可以 AC 本题了 。

代码较乱 , 请见谅 。 如果我讲的那里不清楚 , 您可以在评论区问 , 我会经常看的 。

posted @ 2025-05-13 22:39  ytz0208  阅读(23)  评论(0)    收藏  举报