P1631 序列合并

原题链接

方法1:

有点像剪枝。
i1~n循环,j同理,如果a[i]+b[j]放不进去,那么a[i]+b[j+1]也放不进去

code

#include<bits/stdc++.h>
using namespace std;
int a[100005];
int b[100005];
int main()
{
    int n;
    cin>>n;
    for(int i=1;i<=n;i++)cin>>a[i];
    for(int i=1;i<=n;i++)cin>>b[i];

    priority_queue<int> q;
    stack<int> c;
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++)
        {
            if(q.size()<n||a[i]+b[j]<=q.top()) q.push(a[i]+b[j]);
            else break;
        }
        while(q.size()>n)q.pop();
    }
    while(!q.empty())
    {
        c.push(q.top());
        q.pop();
    }
    while(c.size())
    {
        cout<<c.top()<<" ";
        c.pop();
    }
    return 0;
}

方法2:看成 n 个 有序表,

有点像游戏机里的滚蛋,又有点像某dijk算法,滚出去一个,恰好排在它后面的一定是下一个最小的,滚进去。

code:

#include<bits/stdc++.h>
using namespace std;
int a[100005];
int b[100005];
int main()
{
    int n;
    cin>>n;
    for(int i=1;i<=n;i++)cin>>a[i];
    for(int i=1;i<=n;i++)cin>>b[i];

    priority_queue<tuple<int, int, int>, vector<tuple<int, int, int>>, greater<tuple<int, int, int>>> q;

    for(int i=1;i<=n;i++) q.push({a[i]+b[1],i,1});

    while (n--) {
    int sum = get<0>(q.top());
    int x = get<1>(q.top());
    int y = get<2>(q.top());
    q.pop();

    if (y + 1 <= n) { // 确保不会超出数组b的范围
        q.push({a[x] + b[y + 1], x, y + 1});
    }

    cout << sum << " ";
}

    return 0;
}


posted @   纯粹的  阅读(5)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
点击右上角即可分享
微信分享提示