思路
给定m个点要选2n个点使得所有点的权值和最小 可将所有点按照权值大小排序,从前往后选2n个点即可*
代码
#include<bits/stdc++.h>
using namespace std;
struct Node
{
int position,weight,id;
};
void solve()
{
int n,m;
cin>>n>>m;
vector<Node> p(m);
for(int i=0;i<m;i++)
{
cin>>p[i].position>>p[i].weight;
p[i].id=i+1;
}
sort(p.begin(),p.end(),[](Node a,Node b)
{
return a.weight<b.weight;
}); //按照权值来排序
int sum=0;
for(int i=0;i<m;i++)
{
if(i<2*n)sum+=p[i].weight;
else p.pop_back(); //只需2n个点其余无用
}
cout<<sum<<endl;
sort(p.begin(),p.end(),[](Node a,Node b)
{
return a.position<b.position;
}); //将所选点按照位置排序
for(int i=0;i<n;i++)cout<<p[i].id<<' '<<p[2*n-i-1].id<<endl; //按照题目要求输出即可
}
int main()
{
int T;
cin>>T;
while(T--)
{
solve();
}
}