w5-1 序列合并

 方法一:

#include <iostream>
#include <queue>
using namespace std;
//排序模拟,tle做法
int now1[100000],now2[100000];
int main() {
    int n;
    priority_queue<int,vector<int>,greater<int> >pq;
    cin>>n;
    for(int i=0;i<n;++i){
        cin>>now1[i];
    }
    for(int i=0;i<n;++i){
        cin>>now2[i];
    }
    for(int i=0;i<n;++i){
        for(int j=0;j<n;++j){
            pq.push(now1[i]+now2[j]);
        }
    }
    int num=0;
    while(num!=n){

        cout<<pq.top()<<" ";
        pq.pop();
        num++;

    }
    return 0;
}

方法二:

#include <iostream>
#include <queue>
using namespace std;
//2 6 6
//1 4 8
//思路:由于一次性做成表会导致空间爆,因此采用动态存储
//先将第一列存入pq,用pair.second记录行数,删去最小数并将其所在行下一个数加入pq
//3 6  10
//7 10 14
//7 10 14
int now1[100000],now2[100000],num[100000];//num表示每一行访问到第几个数
int main() {
    int n;
    priority_queue<pair<int,int>,vector<pair<int, int>>,greater<pair<int, int>>>pq;
    //注:pair 可以直接用比较运算符比较大小,两个pair 首先比较first的大小,first相等后然后在比较second的大小
    cin>>n;
    for(int i=0;i<n;++i){
        cin>>now1[i];
    }
    for(int i=0;i<n;++i){
        cin>>now2[i];
    }
    for(int i=0;i<n;++i){//初始化:第一列
        pq.push(pair<int,int>(now1[i]+now2[0],i));
    }
    while(n--){
        cout<<pq.top().first<<' ';
        int i=pq.top().second;
        pq.pop();
        pq.push(pair<int,int>(now1[i]+now2[++num[i]],i));//插入该行的下个值

    }

    return 0;
}

 

posted @ 2023-04-19 22:44  lijunjie03  阅读(55)  评论(0)    收藏  举报