0
点赞
收藏
分享

微信扫一扫

codeforces1650C

瑾谋 2022-03-26 阅读 35

添加链接描述
给出一些点的坐标 并给出每个点对应的权值
让找到n个区间 最外面的区间严格包括它里面的区间 直到最里面的区间 都是严格包括 要求输出这2*N个点的权值加一块的最小值

#include<bits/stdc++.h>
using namespace std;
map<int,int>w;
map<int,int>r;
bool cmp(pair<int,int> &a,pair<int,int> &b)
{
	return a.second<b.second;//这里要加上取地址符号 
}
int main()
{
	int i,j,k,m,n,sum=0,t,b;
	cin>>t;
	while(t--)
	{
		w.clear();
		r.clear();
		cin>>n>>m;
		sum=0;
		for(i=1; i<=m; i++)
		{
			cin>>k>>b;
			w[k]=b;
			r[k]=i;
			sum+=b;
		}
//		vector<pair<int,int>> w(w.begin(),w.end());
		vector<pair<int, int>> w_vec(w.begin(), w.end());//将map放入vector中 
//		printf("+++++\n");
		sort(w_vec.begin(),w_vec.end(),cmp);//对map排序 
		while(w_vec.size()>2*n)
		{
//
			auto it=w_vec.end();//因为是从小到大排序 所以这里最后一个就是重量最大的 把它删掉就可以了  我在想既然可以从小到大排序为什么不能从大到小排序呢 这样只用删除第一个就可以了 显然是不可以的 每次都删除第一个 所有的顺序都会发生变化 
			it--;
			sum-=it->second;
			w_vec.erase(it);
			r.erase(it->first);
		}
		cout<<sum<<endl;
		for(i=1; i<=n; i++)
		{
			auto it1=r.begin();
			auto it2=r.end();
			it2--;
			cout<<it1->second<<" "<<it2->second<<endl;
			r.erase(it1->first);
			r.erase(it2->first);
		}
	}
	return 0; 
}
举报

相关推荐

0 条评论