题意:给出n支队伍,然后有2n个人,两两组队,组队的条件i,j两个人的能力值aij越大越好
思路:对于这种频繁地求最大值,优先想到的就是优先队列
题目链接:http://codeforces.com/problemset/problem/579/B
#include<bits/stdc++.h>
using namespace std;
struct node
{
int x,y,val;
bool operator <(const node &a) const
{
return a.val>val;//按val从大到小排列
}
};
int a[1000];
int main(void)
{
int n;
scanf("%d",&n);
node e;
priority_queue<node> q;
memset(a,0,sizeof(a));
for(int i=2; i<=2*n; i++)
{
for(int j=1; j<i; j++)
{
int x;
scanf("%d",&x);
e.x=i,e.y=j,e.val=x;
q.push(e);
}
}
while(!q.empty())
{
node f=q.top();
q.pop();
if(!a[f.x]&&!a[f.y]) //必须保证f.x和f.y都还没有组队
{
a[f.x]=f.y;
a[f.y]=f.x;
}
}
for(int i=1; i<=2*n; i++)
printf("%d%c",a[i],i==2*n?'\n':' ');
return 0;
}