二分
直接二分
x
x
x的值 (1~n)
然后我们对于当前二分到的
x
x
x值做题目中的处理。
做完之后我们判断是否合法
合法就打擂台
至于怎么处理,请看我的注释!
AC~Code
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;
long long m,n,k;
long long check(long long x)
{
long long g=0,d=k,y,dy;
while(d!=0)
{
y=(n-g)/x; //取y
if(y<=m) //如果<=m
{
g+=m*d; //直接累加判断
break;
}
else
{
dy=(n-g)/y-x+1; //看最多能有几个当前的y
if(dy<=d)
{
g+=y*dy; //直接减去最多有的当前的y
d-=dy; //减去次数
}
else
{
g+=d*y; //直接相乘输出
break;
}
}
}
return g;
}
int main()
{
freopen("loan.in","r",stdin);
freopen("loan.out","w",stdout);
cin>>n>>k>>m;
long long l=1,r=1e12,mid;
while(l+1<r) //二分
{
mid=(l+r)/2;
if(check(mid)>=n)
l=mid;
else
r=mid;
}
cout<<l;
return 0;
}