poj 2442 Sequence

题目链接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;
}
    

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值