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; }