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;
}
时间: 2024-08-27 11:52:38

codevs1245 最小的N个和的相关文章

京瓷成功开发全球最小贴片晶振CX1008有什么特点?

京瓷成功开发全球最小CX1008贴片晶振,已于5月开始了此款全球最小水晶振动子的样品供应.这无疑是市场上小型化产品的福音,京瓷集团在全球的事业涉及原料.零件.设备.机器,以及服务.网络等各个领域.所有的生产线都具备顺应时代变化的速度感,通过融合集团的独特技术,进一步积极创造新产品.开拓新市场.亿金电子京瓷晶振代理商接下来给大家讲讲这款全球最小贴片晶振CX1008晶振. 那么CX1008晶振这款目前全球最小尺寸水晶振荡子相较于其他贴片石英晶振具有哪些特点呢?CX1008贴片晶振在产品中使用具有哪些

第13条:使类和成员的可访问性最小化

区别设计良好的模块和设计不好的模块,最重要的因素在于,这个模块对于外部的其他模块而言,是否隐藏其内部数据和其他实现细节.设计良好的模块会隐藏所有的实现细节,把它的API于它的实现清晰地隔离开来.然后,模块之间通过它们的API进行通信,一个模块不需要知道其他模块的内部工作情况,这个概念称为信息隐藏或封装.使类和成员的可访问性最小化可以有效的解除系统中各个模块的耦合度.实现每个模块的独立开发.使得系统更加的可维护,更加的健壮.对于顶层的(非嵌套的)类和接口,只有两种可能的访问级别,包级私有的和公有的

旋转数组的最小数字

题目描述 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素.例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1.NOTE:给出的所有元素都大于0,若数组大小为0,请返回0. class Solution { public: int minNumberInRotateArray(vector<int> rotateArray) { if(rotateArray.size()==0) re

【BZOJ2039】【2009国家集训队】人员雇佣 [最小割]

人员雇佣 Time Limit: 20 Sec  Memory Limit: 259 MB[Submit][Status][Discuss] Description 作为一个富有经营头脑的富翁,小L决定从本国最优秀的经理中雇佣一些来经营自己的公司.这些经理相互之间合作有一个贡献指数,(我们用Ei,j表示i经理对j经理的了解程度),即当经理i和经理j同时被雇佣时,经理i会对经理j做出贡献,使得所赚得的利润增加Ei,j.当然,雇佣每一个经理都需要花费一定的金钱Ai,对于一些经理可能他做出的贡献不值得

hiho 第118周 网络流四&#183;最小路径覆盖

描述 国庆期间正是旅游和游玩的高峰期. 小Hi和小Ho的学习小组为了研究课题,决定趁此机会派出若干个调查团去沿途查看一下H市内各个景点的游客情况. H市一共有N个旅游景点(编号1..N),由M条单向游览路线连接.在一个景点游览完后,可以顺着游览线路前往下一个景点. 为了避免游客重复游览同一个景点,游览线路保证是没有环路的. 每一个调查团可以从任意一个景点出发,沿着计划好的游览线路依次调查,到达终点后再返回.每个景点只会有一个调查团经过,不会重复调查. 举个例子: 上图中一共派出了3个调查团: 1

BZOJ2458 [BeiJing2011]最小三角形

Description Xaviera现在遇到了一个有趣的问题. 平面上有N个点,Xaviera想找出周长最小的三角形. 由于点非常多,分布也非常乱,所以Xaviera想请你来解决这个问题. 为了减小问题的难度,这里的三角形也包括共线的三点. Input 第一行包含一个整数N表示点的个数. 接下来N行每行有两个整数,表示这个点的坐标. Output 输出只有一行,包含一个6位小数,为周长最短的三角形的周长(四舍五入). Sample Input 4 1 1 2 3 3 3 3 4 Sample

HDU 1257(最小拦截系统)

Description 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不 能超过前一发的高度.某天,雷达捕捉到敌国的导弹来袭.由于该系统还在试用阶段,所以只有一套系统,因此有可能不能拦截所有的导弹. 怎么办呢?多搞几套系统呗!你说说倒蛮容易,成本呢?成本是个大问题啊.所以俺就到这里来求救了,请帮助计算一下最少需要多少套拦截系统. Input 输入若干组数据.每组数据包括:导弹总个数(正整数),导弹依此

Linux的最小化安装

在安装Linux操作系统时,应遵循最小化安装的原则,即不需要或不确定是否需要的包就不安装,这是一个良好的习惯.最小化安装可以在一定程度上为系统瘦身,但更为重要的一点就是它可以提高系统安全性.本文以CentOS6.6为例,来说明最小化安装Linux操作系统的步骤.在CentOS6.6包选择界面之前的安装过程就不再赘述了,直接进入包选择界面,见以下截图: 在安装完成后,如果发现部分包组没有被选择(当然也可能系统并不是你安装的),可以使用yum groupinstall “Desktop” “X wi

Vijos1352 NOI2006 最大获利 最小权闭合图

Orz胡伯涛<最小割模型在信息学竞赛中的应用> 建图方法: 设立源点S和汇点T,S和用户(共M个)连边,载流量为满足其要求的获利 T和中转站(共N个)连边,载流量为建立该中转站的费用 每个用户向对应的2个中转站连边,载流量为inf 对该图跑一遍最大流,求出最小割f,(∑Ci)-f就是答案 1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 #include <queue&g