#include<bits/stdc++.h>
using namespace std;
//贪心,每次选择最长天数的土地,暴力得到70分
struct land{
int day;
int cost;
}l[100000];
bool cmp(land a,land b){
return a.day>b.day;
}
int main(){
int n,m,k;
cin>>n>>m>>k;
for(int i=0;i<n;i++){
cin>>l[i].day>>l[i].cost;
}
sort(l,l+n,cmp);
while(m>0){
if(m>=l[0].cost&&l[0].day>k){
m-=l[0].cost;
l[0].day--;
sort(l,l+n,cmp);
}
else{
break;
}
}
cout<<l[0].day<<endl;
}
总结:其实不用一天一天去判断
优化1:应该对本身天数相同的土地同时投入资源,不然没有用呀
优化2:二分法,最长耗时只可能有k到mx,二分遍历所有可能
#include<bits/stdc++.h>
using namespace std;
struct land{
int day;
int cost;
}l[100000];
int n,m,k;//小技巧,全局变量!
bool f(int x){
int sum=0;
for(int i=0;i<=n;i++){
if(l[i].day<=x)continue;
sum+=(l[i].day-x)*l[i].cost;
if(sum>m)return false;
}
return true;
}
int main(){
cin>>n>>m>>k;
int md;
for(int i=0;i<n;i++){
cin>>l[i].day>>l[i].cost;
md=max(md,l[i].day);
}
//sort(l,l+n,cmp);
int l=k,r=md;
while(l<=r){//二分没你想的那么难吧!
int mid=l+(r-l)/2;
if(f(mid))r=mid-1;
else l=mid+1;
}
cout<<l<<endl;
return 0;
}