[算法设计与分析] 序列最小和 (优先队列)
tag:优先队列,STL
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; }