链接:https://vjudge.net/problem/POJ-2442
一个最大堆的问题,比较简单,按照如下思路:
1、将前两组数组降序排序
2、将a[0]和 b[0]-b[n] 这n个和入队(优先队列)
3、将a[1]-a[n]分别和b[0]-b[n]求和,与队列中最大元素比较,若小于最大元素,最大元素出队,然后入队。
4、将队列中的n个最终元素赋给数组a
5、输入第3-n组数据,每输入一组完成1-4步骤一次。
6、最后倒序输出数组a
总结:本题要求6000ms,所以此方法不会TL,虽然容易想但是效率比较低。
AC代码:
#include<iostream>
#include<algorithm>
#include<queue>
#include<cstring>
using namespace std;
int a[2100],b[2100];
priority_queue<int> all;
int main(){
int t;
int m,n;
cin>>t;
while(t--){
memset(a,0,sizeof(a));
cin>>m>>n;
for(int j=0;j<n;j++)cin>>a[j];
while(--m){
for(int j=0;j<n;j++)cin>>b[j];
sort(a,a+n,greater<int>());
sort(b,b+n,greater<int>());
/for(int i=0;i<n;i++){
cout<<a[i];
}
cout<<endl;
for(int i=0;i<n;i++){
cout<<b[i];
}
cout<<endl;/
for(int i=0;i<n;i++)all.push(a[0]+b[i]);
for(int i=1;i<n;i++){
for(int j=0;j<n;j++){
if(a[i]+b[j]<all.top()){all.pop();all.push(a[i]+b[j]);}
}
}
for(int i=0;i<n;i++){a[i] = all.top();all.pop();}
}
for(int i=n-1;i>0;i--)cout<<a[i]<<" ";
cout<<a[0]<<endl;
}
return 0;
}
3797ms