100pts但是被hack
查看原帖
100pts但是被hack
1105993
Misserina楼主2024/8/11 18:35

代码可读性有点低敬请谅解

#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);
}
2024/8/11 18:35
加载中...