当前位置: 首页 > news >正文

国外做图标网站时代汇创网站建设

国外做图标网站,时代汇创网站建设,住房和城乡建设网站 上海,dw网页设计制作网站的成品P1631 序列合并 题目描述 有两个长度为 N N N 的单调不降序列 A , B A,B A,B,在 A , B A,B A,B 中各取一个数相加可以得到 N 2 N^2 N2 个和,求这 N 2 N^2 N2 个和中最小的 N N N 个。 输入格式 第一行一个正整数 N N N; 第二行 …

P1631 序列合并

题目描述

有两个长度为 N N N单调不降序列 A , B A,B A,B,在 A , B A,B A,B 中各取一个数相加可以得到 N 2 N^2 N2 个和,求这 N 2 N^2 N2 个和中最小的 N N N 个。

输入格式

第一行一个正整数 N N N

第二行 N N N 个整数 A 1 … N A_{1\dots N} A1N

第三行 N N N 个整数 B 1 … N B_{1\dots N} B1N

输出格式

一行 N N N 个整数,从小到大表示这 N N N 个最小的和。

输入输出样例 #1

输入 #1

3
2 6 6
1 4 8

输出 #1

3 6 7

说明/提示

对于 50 % 50\% 50% 的数据, N ≤ 1 0 3 N \le 10^3 N103

对于 100 % 100\% 100% 的数据, 1 ≤ N ≤ 1 0 5 1 \le N \le 10^5 1N105 1 ≤ a i , b i ≤ 1 0 9 1 \le a_i,b_i \le 10^9 1ai,bi109

题解

本题可以将所有序列的和都算出来,然后排序,输出前 N N N 个。

但是这样的时间复杂度为 O ( N 2 ) O(N^2) O(N2),会超时。

所以我们需要优化。

本题的关键在于单调不降

那么显然,对于合并即相加后的序列,其一定是单调不降的。

即:

  • a[1] + b[1] ≤ a[1] + b[2] ≤ a[1] + b[3] ≤ … ≤ a[1] + b[n] ;
  • a[2] + b[1] ≤ a[2] + b[2] ≤ a[2] + b[3] ≤ … ≤ a[2] + b[n] ;

我们可以列表(横向b递增,竖向a递增):

a[1] + b[1]a[1] + b[2]a[1] + b[3]············a[1] + b[n]
a[2] + b[1]a[2] + b[2]a[2] + b[3]············a[2] + b[n]
a[3] + b[1]a[3] + b[2]a[3] + b[3]············a[3] + b[n]
····························································
a[n] + b[1]a[n] + b[2]a[n] + b[3]············a[n] + b[n]

对于整个表,最小的一项一定是a[1] + b[1],次小的一定是a[1] + b[2]或a[2] + b[1],以此类推。

那我们可以用小根堆来维护这个表。

每次取出最小的一项,然后将其下一项加入队列。

这样的时间复杂度为 O ( N l o g N ) O(NlogN) O(NlogN)

具体来说,根据题意我们需要找出前 N N N 小的和,所以我们需要维护一个大小为 N N N 的优先队列。

那么我们可以先计算出第一行,即a[1] + b[1]到a[1] + b[n],然后将其加入优先队列。

然后我们可以取出队列中的最小值,即a[1] + b[1],然后将其下一项a[2] + b[1]加入队列。

代码实现

#include <iostream>
#include <queue>
using namespace std;const int N = 1e5 + 10;int n;
int a[N],b[N];struct node{int sum;int i,j;bool operator < (const node& x) const{return sum > x.sum;}
};priority_queue<node> heap;int main(){cin >> n;for(int i = 1;i <= n;i++) cin >> a[i];for(int i = 1;i <= n;i++) cin >> b[i];for(int i = 1;i <= n;i++){heap.push({a[i] + b[1],i,1});}for(int k = 1;k <= n;k++){auto t = heap.top();heap.pop();int sum = t.sum,i = t.i,j = t.j;cout << sum << " ";if(j <= n) heap.push({a[i] + b[j + 1],i,j + 1});}return 0;
}
http://www.dtcms.com/a/428152.html

相关文章:

  • 唐山专业做网站什么是网页和网站
  • yolov13推理示例
  • 深圳外贸网站外贸网站建设wordpress分享此文章
  • 【手撸IM】高性能HTTP API服务设计与实现
  • ManySpeech 使用 C# 开发人工智能应用
  • 网站备案进程查询网站建设方案报价单
  • 什么是多活演练
  • 关陇集团联姻
  • 初始化electron项目运行后报错 electron uninstall 解决方法
  • 织梦系统网站首页upcache=1专题制作 wordpress
  • WinForm中的圆环
  • 西昌网站制作域名后有个wordpress
  • 2、docker入门基本概念
  • 福州网站建设的公司小型企业建设网站
  • 第三章 神经网络
  • 网络公司发生网站建设费分录北京海淀建设中路哪打疫苗
  • 自己开外销网站怎么做WordPress图片无缝
  • 电脑可以连蓝牙耳机吗?
  • 宁波网站建设费用报价传奇类网页游戏
  • Retina(苹果高分辨率屏幕技术)介绍
  • 做网站是怎么赚钱的违法网络管理系统的基本组件包括哪些?
  • 无人机大脑系统与技术解析
  • 珠宝行业网站建设学室内设计就是失业
  • 动态规划方法详解
  • 儿童摄影网站源码360全景网站怎么做
  • 可以做蛋白三位结构图的网站注册wordpress博客
  • Java并发编程:从源码分析ThreadPoolExecutor的三大核心机制
  • DAC芯片---ES8156
  • wordpress正文底部版权声明sem优化公司
  • Java高频笔试、面试题