题目
题解思路
这样贪心使得我们每次只查询了有可能成为新的值的情况。属实巧妙。
如何将这个两个数组的方法延展成N个数组的。
我们先处理出a数组的初始情况,再将a数组逐一和之后的每一个数组使用这个方法,将记录出的前N大的数再次更新进a数组,之后可能N大的值必然从这N个情况中改变。
AC代码
#include <bits/stdc++.h>
//#include <unordered_map>
//priority_queue
#define PII pair<int,int>
#define ll long long
using namespace std;
const int INF = 0x3f3f3f3f;
const int N = 200100;
int a[510] ;
int b[510] ;
int c[510] ;
int main()
{
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
int n ;
cin >> n ;
for (int i = 0 ; i < n ; i++ )
cin >> a[i] ;
long long res = 0 ;
sort(a,a+n,greater<int>());
for (int i = 1 ; i < n ; i++ )
{
priority_queue <PII> q ;
for (int j = 0 ; j < n ; j++ )
cin >> b[j] ;
for (int j = 0 ; j < n ; j++ )
{
q.push({b[j]+a[0],0}) ;
}
for (int j = 0 ; j < n ; j++ )
{
auto sp = q.top() ;
q.pop() ;
c[i] = sp.first ;
q.push({sp.first - a[sp.second] +a[sp.second+1] ,sp.second+1}) ;
}
memcpy(a,c,4*n) ;
}
for (int i = 0 ; i < n ; i++ )
cout << a[i] << " " ;
cout << "\n" ;
return 0 ;
}