一道例题

来源:互联网 发布:qq农场运输机数据 编辑:程序博客网 时间:2024/05/29 18:53

题目:
有 2 个整数数组(A 和 B),各包含 N 个元素。在每个数组中取一个元素加起来,就可以得到 N^2 个和。求这些和中最小的 N 个值。

思路:
1.暴力:O(n^2);

2.开个堆,O(nlogn);

#include<iostream>#include<cstring>#include<algorithm>#include<cstdio>#include<queue>;using namespace std;const int MAXN=200001;int a[MAXN],b[MAXN],c[MAXN];int n;struct hh{    int sum,num;};bool operator < (hh a,hh b){    return a.sum > b.sum;}priority_queue<hh>q;void solve(){    scanf("%d",&n);    for(int i=1;i<=n;i++) scanf("%d",&a[i]);    for(int i=1;i<=n;i++) scanf("%d",&b[i]);    sort(a+1,a+n+1),sort(b+1,b+n+1);    for(int i=1;i<=n;i++) q.push({a[i]+b[1],1});    for(int i=1;i<=n;i++)    {        hh x=q.top();        q.pop(),c[i]=x.sum;        if(x.num+1<=n)            q.push({c[i]-b[x.num]+b[x.num+1],x.num+1});//c[i]=a[?]+b[x.num];    }    for(int i=1;i<=n;i++) printf("%d ",c[i]);    return;}int main(){    solve();    return 0;}
原创粉丝点击