STL

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;
} 
原文地址:https://www.cnblogs.com/SunChuangYu/p/12488917.html