求调
查看原帖
求调
763878
Jerry_heng楼主2023/10/3 00:33

照着第一篇题解打的。

#include<bits/stdc++.h>
using namespace std;
int n,p,s,ans,op[3010];
struct node{
	int val,id;
	node(int x=0,int y=0){
		id=x;val=y;
	}
	bool operator<(const node &x)const{
		return val>x.val;
	}
	bool operator>(const node &x)const{
		return val<x.val;
	}
}a[3010],b[3010];
priority_queue<node,vector<node>,greater<node> >q1,q2,q3;
bool cmp(node x,node y){
	return x.id<y.id;
}
int main(){
	cin>>n>>p>>s;
	for(int i=1;i<=n;i++)cin>>a[i].val,a[i].id=i;
	for(int i=1;i<=n;i++)cin>>b[i].val,b[i].id=i;
	sort(a+1,a+n+1);
	for(int i=1;i<=p;i++)op[a[i].id]=1,ans+=a[i].val;
	sort(a+1,a+n+1,cmp);
	for(int i=1;i<=n;i++){
		q1.push(node(a[i].val,i));
		q2.push(node(b[i].val,i));
		q3.push(node(b[i].val-a[i].val,i));
	}
	for(int hyh=1;hyh<=s;hyh++){
		int now=-INT_MAX,pos1,pos2,opt;
		while(!q2.empty()&&op[q2.top().id]!=0)q2.pop();
		if(!q2.empty()){
			if(q2.top().val>now){
				now=q2.top().val;
				pos1=q2.top().id;
				opt=1;
			}
		}
		while(!q3.empty()&&op[q3.top().id]!=1)q3.pop();
		while(!q1.empty()&&op[q1.top().id]!=0)q1.pop();
		if(!q1.empty()&&!q3.empty()){
			int sum=q1.top().val+q3.top().val;
			if(sum>now){
				now=sum;
				pos1=q3.top().id;
				pos2=q1.top().id;
				opt=2;
			}
		}
		ans+=now;
		if(opt==1){
			q2.pop();
			op[pos1]=2;
		}
		else{
			q1.pop(),q3.pop();
			op[pos1]=2,op[pos2]=1;
			q3.push(node(b[pos2].val-a[pos2].val,pos2));
		}
	}
	cout<<ans<<endl;
	for(int i=1;i<=n;i++)
		if(op[i]==1)cout<<i<<" ";
	cout<<endl;
	for(int i=1;i<=n;i++)
		if(op[i]==2)cout<<i<<" ";
	return 0;
}
2023/10/3 00:33
加载中...