暴力算法
枚举所有求和情况,排序后输出第n个即可,时间复杂度O(nlogn),代码就不贴了
如何优化
定义一个数组pos,代表代表a[i]
当前与b
数组匹配最小和时b
的下标。最开始pos内部为1,定义优先队列q,把所有的i装进去,按a[i]+b[pos[i]]的值从小到大排序,输出,重复执行上面的操作n次后结束
ACcode
#include <iostream>
#include <queue>
using namespace std;
#define int long long
#define F(i,a,b) for(int i=(a);i<=(b);i++)
const int N=1e5+5;
int a[N],b[N],pos[N];
int n;
struct cmp
{
bool operator ()(int i,int j)
{
return a[i]+b[pos[i]]>a[j]+b[pos[j]];
}
};
priority_queue<int,vector<int>,cmp> q;
signed main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
pos[i]=1;
}
for(int i=1;i<=n;i++) cin>>b[i];
for(int i=1;i<=n;i++) q.push(i);
for(int i=1;i<=n;i++)
{
int cur=q.top();
q.pop();
printf("%d ",a[cur]+b[pos[cur]]);
pos[cur]++;
q.push(cur);
}
return 0;
}