代码可读性有点低敬请谅解
#include <bits/stdc++.h>
using namespace std;
int n,k;
long long m,p,c,t,T;
struct cow {
int id;
long long pr;
long long co;
long long sub;
int ascoid;
} arr[50005],aspr[50005],asco[50005];
long long subs[50005];
bool marked[50005];
bool cpr(cow a,cow b) {
return a.pr<b.pr;
}
bool cco(cow a,cow b) {
return a.co<b.co;
}
bool comp(long long a,long long b) {
return a>b;
}
priority_queue <long long> q;
map<long long,stack<int> > pricetoascopos;
bool check(int n,int k,long long budget) {
if (n==0) return 1;
long long mon=0;
while (!q.empty()) q.pop();
for (int i=1;i<=n;i++) {
mon+=aspr[i].pr;
subs[i]=aspr[i].sub;
marked[aspr[i].ascoid]=1;
q.push(aspr[i].pr);
pricetoascopos[aspr[i].pr].push(aspr[i].ascoid);
}
int ascopos=1;
for (int i=1;i<=k;i++) {
while (ascopos<=n && marked[ascopos]) ascopos++;
mon=mon-q.top()+asco[ascopos].co;
int lastascopos=pricetoascopos[q.top()].top();
pricetoascopos[q.top()].pop();
q.pop();
q.push(asco[ascopos].co);
marked[ascopos]=1;
marked[lastascopos]=0;
if (lastascopos<ascopos) ascopos=lastascopos;
if (mon<=budget) return 1;
}
return 0;
}
int main() {
scanf("%d%d%lld",&n,&k,&m);
for (int i=1;i<=n;i++) {
scanf("%lld%lld",&p,&c);
cow tmp;
tmp.id=i;
tmp.pr=p;
tmp.co=c;
tmp.sub=p-c;
arr[i]=tmp;
}
int start=0,end=0;
sort(arr+1,arr+n+1,cpr);
t=0;
for (int i=1;i<=n;i++) {
if (t+arr[i].pr<=m) {
t+=arr[i].pr;
start++;
}
aspr[i]=arr[i];
}
sort(arr+1,arr+n+1,cco);
T=0;
for (int i=1;i<=n;i++) {
if (T+arr[i].co<=m) {
T+=arr[i].co;
end++;
}
asco[i]=arr[i];
asco[i].ascoid=i;
}
while (start<=end) {
int mid=(start+end)/2;
if (check(mid,k,m)) start=mid+1;
else end=mid-1;
}
printf("%d",end);
}