CodeForces 592C (胡搞)

本文解析了CodeForces上的一道竞赛题592C,题目要求计算在特定长度范围内无法判断两个选手胜负的概率。通过分析最小公倍数和最短移动距离,给出了详细的解题步骤及代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

http://codeforces.com/problemset/problem/592/C


题意是:
两个人A和B每个人每走一步的距离分别为w,b。现在给一个跑道,跑道后面是悬崖,人不能掉进悬崖。问最终A和B谁离起点越远谁获胜。
然后给一个长度L,问在长度L的范围里面,不能判断胜负的概率是多少。


解题思路:
1.当距离小于min(w,b)时,两人都在原点,不能判断出胜负。
2.当距离为w,b的最小公倍数时,即 lcm(w,b)时,不能判断出胜负。
3.当距离为 K*lcm(w,b)+min(w-1,b-1)时,两人都在 K * lcm(w,b)处,不能判断胜负。
4.当跳完最后一个满足 K*lcm(w,b)<=t的K时,后面有一段距离要巧妙的处理,这时候要取 min(min(w-1,b-1),t%lcm(w,b))。主要是避免 K * lcm(w,b) + min(w-1,b-1) > t的情况。

其中求lcm时,换成double型增大Long long 的范围。
感觉稍微有点难度的地方是第三点不好想。


#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <set>
#include <vector>
#include <map>
#include <queue>
#include <stack>
#include <algorithm>
using namespace std;
typedef long long LL;

const double eps = 1e-9;
LL gcd(LL a,LL b)
{
    return b==0?a:gcd(b,a%b);
}

int main()
{
    LL t,w,b;
    cin>>t>>w>>b;

    LL tmp = gcd(w,b);

    LL ans = min(min(w-1,b-1),t);

    if(!(1.*w/tmp * b - t > eps))
    {
        LL  lcm = w/tmp *b;
        ans += t/lcm + (t/lcm-1)*min(w-1,b-1) + min(min(w-1,b-1),t%lcm);
    }

    LL now = gcd(ans,t);
    cout<<ans/now<<"/"<<t/now<<endl;
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值