2020 GDUT Rating Contest III (Div. 2) B - Loan Repayment 题解

原题

在这里插入图片描述

题目大意

给出 N N N K K K M M M,假定已经给了 G G G加仑奶,定义 N − G X \frac{N-G}{X} XNG Y Y Y Y Y Y最小为 M M M,在 K K K天后至少给 N N N加仑奶,求最大的 X X X

题目分析

一条数学题, X X X是明显可以二分的,然后剩下是怎么检查的问题了
检查是不能一天天去算的,那样肯定会TLE,所以要找方法加速计算
在一定天数之后, G G G足够大,那后面的所有天数肯定都是 M M M,这是一个剪枝
还有一个要算的就是同样的 Y Y Y能够持续几天,只要后面 N − G X \frac{N-G}{X} XNG都是 Y Y Y,那我们可以一起处理,算出来是持续 T r u n c ( r m Y ) − X + 1 Trunc(\frac{rm}{Y})-X+1 Trunc(Yrm)X+1天(rm为当前剩余量, T r u n c Trunc Trunc为下取整),好像就是这样了

代码

#include<cstdio>
#define min(a,b) (a < b ? a : b)
 
long long n,k,m;
bool judge(long long x)
{
    long long y,a,rm = n,t = k;
    while (t and rm > 0)
    {
        y = rm / x;
        if (y > m) a = min(rm / y - x + 1,t),rm -= a * y,t -= a;
        else rm -= t * m,t = 0;
    }
    return rm <= 0;
}
int main()
{
    scanf("%lld%lld%lld",&n,&k,&m);
    long long l = 1,r = n;
    while (l <= r)
    {
        long long mid = (l + r) >> 1;
        if (judge(mid)) l = mid + 1;else r = mid - 1;
    }
    printf("%lld",r);
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值