原题
题目大意
给出 N N N, K K K, M M M,假定已经给了 G G G加仑奶,定义 N − G X \frac{N-G}{X} XN−G为 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}
XN−G都是
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;
}