题目链接http://poj.org/problem?id=2442
stl实在是tql
借助两个数组的想法,如果当前最小值是a[1] + b[1],那么下一个最小值就会是a[2] + a[1],a[1] + a[2]中的
用堆维护一下就好 耶耶耶
#include <iostream>
#include <algorithm>
#include <queue>
#include <utility>
#include <vector>
using namespace std;
typedef long long ll;
typedef long double ld;
const int maxn = 1e5 + 100;
const ll mod = 1e9 + 7;
ll to[maxn],a[maxn],b[maxn],c[maxn];
int main()
{
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
ll t;
cin >> t;
while(t--)
{
//priority_queue<pair<ll,ll>,vector<pair<ll,ll> >,greater<pair<ll,ll> > >q;
ll n,m;
cin >> m >> n;
for(int i = 1; i <= n; i ++)
{
cin >> a[i];
}
sort(a + 1, a + n + 1);
m--;
while(m--)
{
priority_queue<pair<ll,ll>,vector<pair<ll,ll> >,greater<pair<ll,ll> > >q;
for(int i = 1; i <= n; i ++)
{
cin >> b[i];
to[i] = 1;
}
sort(b + 1, b + n + 1);
for(int i = 1; i <= n; i ++)
{
q.push(make_pair(a[1] + b[i],i));
}
ll w = 0;
ll po = n;
while(po--)
{
ll be = q.top().first;
c[++w] = be;
ll i = q.top().second;
q.pop();
q.push(make_pair(a[++to[i]] + b[i], i));
}
for(int i = 1; i <= n; i ++)
{
a[i] = c[i];
}
}
for(int i = 1; i <= n; i ++)
{
cout << a[i] << " ";
}
cout << "\n";
}
return 0;
}