https://www.luogu.com.cn/problem/P4040
我的代码:
#include <bits/stdc++.h>
using namespace std;
long long n;
long long m,f;
struct food{
long long p;
long long s;
}foods[205];
bool cmp(food a,food b){
if(a.p != b.p)
return a.p < b.p;
else
return a.s > b.s;
}
long long chk(long long time){//Time:Send food count
long long tm = m;//all price together
tm -= time*f;
long long every = tm/time;
long long rest = tm - every*time;
long long day = 0;//insist day (baozhiqi we need)
long long i = 1;
// every can insist how long day;
for(;i<=n;i++){
//TLE
//while(every >= foods[i].p && foods[i].s>= day){
// c -= foods[i].p;
// day ++;
//}
if(every >= foods[i].p && foods[i].s>= day){
long long number = min(every / foods[i].p,foods[i].s+1 - day);// how many we buy
// how many we can buy , baozhiqi's limitation
day += number;
every -= number *foods[i].p;
}
if(foods[i].p > every)//can't afford
break;
}
rest += every*time;
long long ans = day *time;
for(long long j = i;j <= n ;j ++){
if(rest >= foods[j].p && foods[j].s>= day){
long long number = rest /foods[j].p ; //every day's mei3 yi4 zu3,so no need to min
//nod need to min, if can ,before that it was divided
ans += number;
break;
}
if(foods[i].p > every)//can't afford
break;
if(ans != day *time)
break; // buy only once to exit
}
return ans;
}
int main(){
cin >> m >> f >> n;
for(long long i=1;i<=n;i++){
long long p,s;
cin >> p >> s;
foods[i].p = p;
foods[i].s = s;
}
// Sort
sort(foods+1,foods+n+1,cmp);
//tri - devide
long long l = 1;
long long r = (f == 0 ? m:m/f);
while(l < r){
//cout << l <<" " <<r<<endl;
long long mid1 = l+(r-l)/3;
long long mid2 = r-(r-l)/3;
if(chk(mid1) > chk(mid2))
r = mid2 - 1;
else if(chk(mid1) == chk(mid2)){
l = mid1 + 1 ;
r = mid2 - 1;
}
else if(chk(mid1) < chk(mid2))
l = mid1 + 1;
}
cout << chk(l);
return 0;
}