[算法设计与分析] 序列最小和 (优先队列)

tag:优先队列,STL

luogu P1631

STL yyds!

//
//  main.cpp
//  序列最小和
//
//  Created by sylvia on 2021/10/25.
//  Copyright © 2021 apple. All rights reserved.
//

/*
 看了luogu题解写的,真的非常巧妙且简单。
 使用STL中priority_queue
 具体使用方法见https://blog.csdn.net/weixin_36888577/article/details/79937886
 首先对数据升序排序,使用小根堆
 pair类型进行捆绑
 第一维是和,第二维是B序列的i值
 因为无论怎样A序列的第一个数是一定会选的,所以把B的所有数加成和加入队列
 这是i,j+1的情况解决了,还有i+1,j的情况
 对此我们每输出一个和,就将输出的和对应的A序列中的i值往后移一个
 使用to【i】数组记录B序列第i个数与A序列第几个数相加
 
 */
#include<stdio.h>
#include<queue>
#include<iostream>
#include<algorithm>
#include<string.h>
using namespace std;
#define M 1000000+5
int a[M],b[M],to[M],n;
priority_queue<pair<int,int>,vector<pair<int,int>>,greater<pair<int,int>>> q;
int main(){
    scanf("%d",&n);
    for (int i=0;i<n;i++){
        scanf("%d",&a[i]);
    }
    memset(to,0,sizeof(to));
    sort(a,a+n);
    
    for (int i=0;i<n;i++){
        scanf("%d",&b[i]);
    }
    sort(b,b+n);
    for (int i=0;i<n;i++){
        q.push(pair<int,int>(a[0]+b[i],i));
    }
    while(n--){
        printf("%d ",q.top().first);
        int ii=q.top().second;
        q.pop();
        q.push(pair<int,int>(a[++to[ii]]+b[ii],ii));
    }
    printf("\n");
    
    
    return 0;
}

 

posted @ 2021-10-25 17:56  Sylvia_lee  阅读(80)  评论(0)    收藏  举报