首页 > 其他 > 详细

E - Sequence POJ - 2442

时间:2020-03-13 21:38:41      阅读:90      评论:0      收藏:0      [点我收藏+]

https://vjudge.net/contest/360957#problem/E

m行n列的一个矩阵

求:每行选一个数,求前n个最小的sum是多少。

思路用优先队列维护前i行的结果,再根据这个遍历求出前i+1行的,以此类推。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#include <queue>
#include <algorithm>
const int MAXN=30030;
int a[MAXN],b[MAXN];
using namespace std;
int main()
{ 
    ios::sync_with_stdio(false);
    cin.tie(0);
    int t;
    cin>>t;
    while(t--)
    {
        priority_queue<int>q;//最大值优先
        int m,n;
        cin>>m>>n;
        for(int i=0; i<n; ++i)
            cin>>a[i];
        sort(a,a+n);//升序排列
        --m;
        while(m--)
        {
            for(int i=0; i<n; ++i)
                cin>>b[i];
            sort(b,b+n);
            for(int i=0; i<n; ++i)//入队
                q.push(a[0]+b[i]);
            for(int i=1; i<n; ++i)//依次比较将较小的和入队
                for(int j=0; j<n; ++j)
                {
                    int temp=a[i]+b[j];
                    if(temp<q.top())
                    {
                        q.pop();
                        q.push(temp);
                    }
                }
            for(int i=0; i<n; ++i)//将队列中的数赋给a数组,同时队列清空
            {
                a[i]=q.top();
                q.pop();
            }
            sort(a,a+n);
            while(q.size()) q.pop();
        }
        for(int i=0; i<n-1; ++i)//输出结果
            cout<<a[i]<<" ";
        cout<<a[n-1]<<endl;
    }
    return 0;
} 

 

E - Sequence POJ - 2442

原文:https://www.cnblogs.com/SunChuangYu/p/12488917.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!