添加链接描述
给出一些点的坐标 并给出每个点对应的权值
让找到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;
}