首先我们想到的肯定是一个超时的暴力算法。
但发现题目要求查找 x x x 的最大值,所以可以想到用二分去优化。
每次判断当前 m i d mid mid 是否符合题目要求。
二分模板:
while(l<r){
mid=(l+r+1)/2;
if(check(mid))
l=mid;
else
r=mid-1;
}
这里只需要将 c h e c k check check 函数改一下即可。
在 c h e c k check check 函数中,我们需要统计当前需要求的 m i d mid mid 是否能满足在 k k k 天内还到 n n n 加仑牛奶。
最后的答案为查找到的 l l l 。
具体代码:
#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,k,m,l,r,mid;
bool check(int mid){
int cnt=0;
int i=k;
while(i>0&&cnt<n){
int y=(n-cnt)/mid;
if(y<m){
if((n-cnt+m-1)/m<=i)
return true;
else
return false;
}
int c2=n-mid*y;
int day=min((c2-cnt)/y+1,i);
cnt+=y*day;
i-=day;
}
if(cnt>=n)
return true;
return false;
}
signed main(){
scanf("%lld%lld%lld",&n,&k,&m);
l=1;
r=1000000000000;
while(l<r){
mid=(l+r+1)/2;
if(check(mid))
l=mid;
else
r=mid-1;
}
printf("%lld",l);
return 0;
}