codevs1245最小的N个和 小根堆
这道题 将b排序一下 将a(i~n)和b1加起来入堆 每次出一次队(ax+bi) 将(ax+bi+1)入队就好了 能保证答案的正确性 找个自己证明吧
#include<cstdio> #include<cstring> #include<algorithm> #include<queue> using namespace std; const int M=100007; int read(){ int ans=0,f=1,c=getchar(); while(c<'0'||c>'9'){if(c=='-') f=-1; c=getchar();} while(c>='0'&&c<='9'){ans=ans*10+(c-'0'); c=getchar();} return ans*f; } int a[M],b[M],n; struct node{ int a,b,w; bool operator<(const node&x)const{return w>x.w;} }; priority_queue<node>q; int main() { n=read(); for(int i=1;i<=n;i++) a[i]=read(); for(int i=1;i<=n;i++) b[i]=read(); sort(b+1,b+1+n); for(int i=1;i<=n;i++) q.push((node){a[i],1,a[i]+b[1]}); for(int i=1;i<=n;i++){ node x=q.top(); q.pop(); printf("%d ",x.w); if(x.b<n) q.push((node){x.a,x.b+1,x.a+b[x.b+1]}); } return 0; }