这个没做出来属实有些惭愧。看了题解觉得很妙。如果直接想的话可能反而很麻烦
题目是给两个n个数的不下降序列,问这两个序列任意各取出一个后相加的最小的n个数是什么。
直接贴题解吧题解 P1631 【序列合并】
一共会产生n*n个数,
a[1]+b[1]<=a[1]+b[2]........<=a[1]+b[n]
a[2]+b[1]<=a[2]+b[2]........<=a[2]+b[n]
.
.
a[n]+b[1]<=a[n]+b[2]........<=a[n]+b[n]
先把这前n个第一个数放入优先队列,最小的加入答案然后把它的下一个放入优先队列即可
查看代码
#include<iostream>
#include<vector>
#include<queue>
using namespace std;
typedef long long ll;
ll n,a[100005],b[100005],q[100005];
priority_queue<pair<int,int>, vector<pair<int,int> >,greater<pair<int, int> > >cc;
signed main()
{
cin>>n;
for(int i=1;i<=n;i++)cin>>a[i];
for(int j=1;j<=n;j++)
{
cin>>b[j];
q[j]++;
cc.push(pair<int,int>(a[1]+b[j],j));
}
while(n--)
{
auto cx=cc.top();
cc.pop();
cout<<cx.first<<' ';
cc.push(pair<int,int>(b[cx.second]+a[++q[cx.second]],cx.second));
}
return 0;
}