Southern Subregion Problem I. Plugs and Sockets

本文介绍了一种模拟竞赛中选择最优题目组合的算法实现。通过使用C++编程语言,该算法考虑了不同类型的题目(Berland、Beuropean和其他类型)并确保在限制条件下选取总分最高的题目集合。具体步骤包括输入题目数据、排序、选择最优题目并进行替换以达到最大分数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

模拟 读题真的是
#include<bits/stdc++.h>
using namespace std;
vector<pair<int,int> >v1;// Berland 
vector<pair<int,int> >v2;// Beuropean 
vector<pair<int,int> >v3;// all
vector<pair<int,int> >ans1;
vector<pair<int,int> >ans2;
int n,a,b,t,rem=0;
long long powe=0;
int main(){
	//freopen("C://Users//Duhao//Desktop//in.txt","r",stdin);
	scanf("%d%d%d",&n,&a,&b);
	for(int i=1;i<=n;i++){
		scanf("%d",&t);
		if(t==1){
			scanf("%d",&t);
			v1.push_back(make_pair(t,i));
		}
		else if(t==2){
			scanf("%d",&t);
			v2.push_back(make_pair(t,i));
		}
		else {
			scanf("%d",&t);
			v3.push_back(make_pair(t,i));
		}
	}
	sort(v1.begin(),v1.end());
	sort(v2.begin(),v2.end());
	sort(v3.begin(),v3.end());
	int siz=v1.size();
	//cout<<siz<<endl;
	if(siz<=a){
		rem+=a-siz;
		for(int i=0;i<siz;i++){
			powe+=v1[i].first;
		    ans1.push_back(v1[i]);
		}
	}
	else {
		for(int i=0;i<a;i++){
			powe+=v1[i].first;
		    ans1.push_back(v1[i]);
		}
	}
	siz=v2.size();
	if(siz<=b){
		rem+=b-siz;
		for(int i=0;i<siz;i++){
			powe+=v2[i].first;
		    ans2.push_back(v2[i]);
		}
	}
	else {
		for(int i=0;i<b;i++){
			powe+=v2[i].first;
		    ans2.push_back(v2[i]);
		}
	}
	int all=0;
	siz=v3.size();
	if(rem>0){
		if(siz<=rem){
			//cout<<"dsad"<<endl;
			int siza=ans1.size(),i=0;
			int sizb=ans2.size();
			for(i=0;i<siz&&siza<a;i++){
				powe+=v3[i].second; 
				ans1.push_back(v3[i]);
				siza++;
				all++;
			}
			for(;i<siz&&sizb<b;i++){
				powe+=v3[i].second; 
				ans2.push_back(v3[i]);
				sizb++;
				all++;
			}
		}
		else {
			int siza=ans1.size(),i=0;
			int sizb=ans2.size();
			for(i=0;i<rem&&siza<a;i++){
				powe+=v3[i].second; 
				ans1.push_back(v3[i]);
				siza++;
				all++;
			}
			for(;i<rem&&sizb<b;i++){
				powe+=v3[i].second; 
				ans2.push_back(v3[i]);
				sizb++;
				all++;
			}
		}
	}
	//cout<<all<<endl;
	int siza=ans1.size();
	int sizb=ans2.size();
	for(int i=all;i<siz;i++){
		int minm1=0,wh1=0,minm2=0,wh2=0;
		for(int j=0;j<siza;j++){
			if(ans1[j].first-v3[i].first>minm1){
				minm1=ans1[j].first-v3[i].first;
				wh1=j;
			}
		}
		for(int j=0;j<sizb;j++){
			if(ans2[j].first-v3[i].first>minm2){
				minm2=ans2[j].first-v3[i].first;
				wh2=j;
			}
		}
		//cout<<minm1<<" "<<minm2<<endl; 
		if(minm1>=minm2){
			if(minm1>0){
				powe-=minm1;
			    ans1[wh1]=v3[i];
			}
		}
		else if(minm2>=minm1){
			if(minm2>0){
				powe-=minm2;
			    ans2[wh2]=v3[i];
			}
		}
	}
	cout<<siza+sizb<<" "<<powe<<endl;
	for(int i=0;i<siza;i++){
		cout<<ans1[i].second<<" "<<i+1<<endl;
	}
	for(int i=0;i<sizb;i++){
		cout<<ans2[i].second<<" "<<i+a+1<<endl; 
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值