【洛谷 2118】 比例化简

思路

先求出大的和小的之间的比例关系,然后枚举倍数,找到 L 以内误差最小的输出,注意特判比例本来就大于L的情况,这时候为了减少误差只能选择 1:L L:1

代码

#include <bits/stdc++.h>
using namespace std;
int main(){
    double a, b, eps = 1e9;
    int ans = 0, num = 0, ok = 0, n;
    scanf("%lf%lf%d", &a, &b, &n);
    if(a < b) swap(a, b), ok = 1;
    double p = a/b;
    if(n <= p){
        if(ok) printf("1 %d", n);
        else printf("%d 1", n);
        return 0;
    }
    for(int i = 1; i <= n; i ++){
        if(p*i > n) break;
        double pp;
        bool is = 1;
        if(((int)(p*i+0.5)) > (p*i)) pp = ((int)(p*i+0.5))-(p*i);
        else pp = (p*i) - ((int)(p*i)), is = 0;
        if(pp < eps){
            eps = pp;
            if(is) ans = ((int)(p*i+0.5)), num = i;
            else ans = ((int)(p*i)), num = i;
        }
    }
    if(ok) printf("%d %d", num, ans);
    else printf("%d %d", ans, num);
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值