POJ 2442(Sequence)

链接: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

最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容