方法一:
#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; }
标签:pq,int,合并,w5,100000,序列,include,now1,now2 From: https://www.cnblogs.com/lijunjie03/p/17334971.html