P4040宅男计划-求调
  • 板块学术版
  • 楼主Yzx_2009
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/12/23 18:26
  • 上次更新2023/12/23 20:52:48
查看原帖
P4040宅男计划-求调
676282
Yzx_2009楼主2023/12/23 18:26

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;
} 
2023/12/23 18:26
加载中...