序列合并
这道题用到了堆;
原来直接暴力只得了60 ;几个TLE
#include<bits/stdc++.h>
using namespace std;
int m,n;
const int ind=100020;
int a[ind];
int u[ind];
void input(){
scanf("%d",&n);
for(int i=1;i<=n;++i)
scanf("%d",&a[i]);
for(int i=1;i<=n;++i)
scanf("%d",&u[i]);
return ;
}
priority_queue<int ,vector<int>,greater<int> >qmin;
int main(){
input();
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
qmin.push(a[i]+u[j]);
for(int i=1;i<=n;++i){
cout<<qmin.top()<<" ";
qmin.pop();
}
return 0;
}
这是后来的代码
#include<bits/stdc++.h>
using namespace std;
int m,n;
const int ind=100020;
int a[ind];
int u[ind];
void input(){
scanf("%d",&n);
for(int i=1;i<=n;++i)
scanf("%d",&a[i]);
for(int i=1;i<=n;++i)
scanf("%d",&u[i]);
return ;
}
int ant[ind];
priority_queue<int>qmax;//大根堆
int main(){
input();
//优化 事实上并没有全部遍历一遍
for (int i=1;i<=n;++i){//遍历
for (int j=1;j<=n;++j){
int c=a[i]+u[j];//和
if (qmax.size()<n)//让大根堆里只有n个元素
qmax.push(a[i]+u[j]);
else {
if(c>=qmax.top()) //若a[i]+u[j]>top,那么a[i]+u[j+~]肯定也大于top;
break; //#省了时间#
else { //否则放进去排一下
qmax.pop();
qmax.push(c);
}
}
}
}
for(int i=1;i<=n;++i){//取出
ant[i]=qmax.top();
qmax.pop();
}
for(int i=n;i>=1;--i)
printf("%d ",ant[i]);
return 0;
}