• 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;
    } 
  • 相关阅读:
    树上DP
    区间dp
    [持续更新]学习并记忆 Linux 下的常用的命令
    区间dp
    codevs 2152
    树上DP入门题
    差分与前缀和
    POJ
    VJ
    Week 5: Object Oriented Programming 9. Classes and Inheritance Exercise: int set
  • 原文地址:https://www.cnblogs.com/SunChuangYu/p/12488917.html
Copyright © 2020-2023  润新知