• codevs1245 最小的N个和


    1245

    最小的N个和

    题目描述 Description

    有两个长度为 N 的序列 A 和 B,在 A 和 B 中各任取一个数可以得到 N^2 个和,求这N^2 个和中最小的 N个。

    输入描述 Input Description

    第一行输入一个正整数N;第二行N个整数Ai 且Ai≤10^9;第三行N个整数Bi,
    且Bi≤10^9

    输出描述 Output Description

    输出仅一行,包含 n 个整数,从小到大输出这 N个最小的和,相邻数字之间用
    空格隔开。

    样例输入 Sample Input

    5

    1 3 2 4 5 
    6 3 4 1 7

    样例输出 Sample Output

    2 3 4 4 5

    数据范围及提示 Data Size & Hint

    【数据规模】 对于 100%的数据,满足 1≤N≤100000。

    思路

    先把两个数组从小到大排个序

    先求出a数组中每个数与b数组中第一个数的和,作为堆的初始值,建一个小根堆,以num为优先级,y其次

    由于我们不确定是a中每个数加b中最小数比较小,还是b中每个数加a中最小数比较小

    所以要让堆动起来,插入的元素就是a中当时的元素与b中下一个元素的和,每次弹出堆顶元素,重复n次即可

    #include<iostream>
    #include<algorithm>
    #include<queue>
    using namespace std;
    int n,a[100001],b[100001];
    struct node{
        int y,num;
        bool operator <(const node &v)const
        {
            return num>v.num;
        }
    };
    node k;
    priority_queue<node>q;
    int main()
    {
        cin>>n;
        for(int i=1;i<=n;i++)cin>>a[i];
        for(int i=1;i<=n;i++)cin>>b[i];
        sort(a+1,a+n+1);
        sort(b+1,b+n+1);
        for(int i=1;i<=n;i++)
        {
            k.y=1;k.num=a[i]+b[1];
            q.push(k);
        }
        int s=1;
        while(s<=n)
        {
            node now=q.top();
            q.pop();
            if(now.y+1<=n)
            {
                k.y=now.y+1;
                k.num=now.num-b[now.y]+b[now.y+1];
                q.push(k);
            }s++;
            cout<<now.num<<' ';
        }
        return 0;
    }
  • 相关阅读:
    让我用69406条评论告诉你“反贪风暴”好不好看!!!
    【大数据】爬取全部的校园新闻
    【大数据】获取一篇新闻的全部信息
    【大数据】理解爬虫原理
    中文统计
    [大数据]统计词频
    数据库表设计以及表字段命名
    设计模式的理论理解
    文件上传之oss服务器上传文件简笔
    QueryWrapper/UpdateWrapper认识
  • 原文地址:https://www.cnblogs.com/thmyl/p/6241455.html
Copyright © 2020-2023  润新知