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;
}
View Code

 

posted @ 2017-06-12 13:43  友人Aqwq  阅读(198)  评论(0编辑  收藏  举报