加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

P1631 序列合并

发布时间:2020-12-14 04:42:31 所属栏目:大数据 来源:网络整理
导读:【题目描述】: 有两个长度都是N的序列A和B,在A和B中各取一个数相加可以得到N^2个和,求这N^2个和中最小的N个。 【输入描述】: 第一行一个正整数N; 第二行N个整数Ai,满足Ai=Ai+1且Ai=10^9; 第三行N个整数Bi,满足Bi=Bi+1且Bi=10^9. 【输出描述】: 输出仅

【题目描述】:

有两个长度都是N的序列A和B,在A和B中各取一个数相加可以得到N^2个和,求这N^2个和中最小的N个。

【输入描述】:

第一行一个正整数N;

第二行N个整数Ai,满足Ai<=Ai+1且Ai<=10^9;

第三行N个整数Bi,满足Bi<=Bi+1且Bi<=10^9.

【输出描述】:

输出仅一行,包含N个整数,从小到大输出这N个最小的和,相邻数字之间用空格隔开。

【样例输入】:

3 2 6 6 1 4 8

【样例输出】:

3 6 7

【时间限制、数据范围及描述】:

时间:1s 空间:128M

对于50%的数据中,满足1<=N<=1000;

对于100%的数据中,满足1<=N<=100,000。

代码

#include<algorithm> #include<iostream> #include<cstring> #include<cstdio> #include<cmath> #include<queue> using namespace std; int n,a[100005],b[100005],c[100005]; struct aaa{ int d,s; }; bool operator >(const aaa &a,const aaa &b){ return a.s>b.s; } priority_queue<aaa,vector<aaa>,greater<aaa> >q; int main() { scanf("%d",&n); for(int i=1;i<=n;i++){ scanf("%d",&a[i]); c[i]=1; } for(int i=1;i<=n;i++){ scanf("%d",&b[i]); } sort(b+1,b+1+n); for(int i=1;i<=n;i++){ q.push((aaa){i,a[i]+b[c[i]]}); } for(int i=1;i<=n;i++){ printf("%d ",q.top().s); aaa h=q.top(); c[h.d]++;q.pop(); q.push((aaa){h.d,a[h.d]+b[c[h.d]]}); } return 0; } 

此题只能够用堆做,试了别的方法,但无果...

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读