最小的N个和(codevs 1245)
有两个长度为 N 的序列 A 和 B,在 A 和 B 中各任取一个数可以得到 N^2 个和,求这N^2 个和中最小的 N个。
第一行输入一个正整数N;第二行N个整数Ai 且Ai≤10^9;第三行N个整数Bi,
且Bi≤10^9
输出仅一行,包含 n 个整数,从小到大输出这 N个最小的和,相邻数字之间用
空格隔开。
5
1 3 2 4 5
6 3 4 1 7
2 3 4 4 5
最暴力的方法:我们可以把所有情况都算出来,再排序,很显然,空间和时间都会爆。
网上的思路:(其实不是很明白这样算出来的i*j-1的前n个解就是最优解)
想办法把一些一定不可能的状态给消除掉。
首先还是给A,B排序,同样还是这个表:
| B\A | 1 | 2 | … | i | … | n |
|---|---|---|---|---|---|---|
| 1 | ||||||
| 2 | ||||||
| … | ||||||
| i | ||||||
| … | ||||||
| n |
观察到,对于(i,j)这个点,比它小的元素至少有i×j−1个。
由于我们要求前N小的,所以满足要求的点至少要满足i×j−1<n即i×j≤n。
这样我们可以把点的个数缩小至
时间复杂度:O(nlog2n)
空间复杂度:O(nlogn)
代码:实测172ms
#include<cstdio>
#include<iostream>
#include<algorithm>
#define M 100010
#define N 3000010
using namespace std;
int a[M],b[M],c[M];
int main()
{
int n;
scanf("%d",&n);
for(int i=;i<=n;i++)
scanf("%d",&a[i]);
for(int i=;i<=n;i++)
scanf("%d",&b[i]);
sort(a+,a+n+);
sort(b+,b+n+);
int cnt=;
for(int i=;i<=n;i++)
for(int j=;i*j<=n;j++)
c[++cnt]=a[i]+b[j];
sort(c+,c+cnt+);
for(int i=;i<=n;i++)
printf("%d ",c[i]);
return ;
}
另一种方法:堆排
思路:
{aa=3;bb=1;s=4};
{aa=3;bb=1;s=4};
{aa=3;bb=1;s=4};
#include <iostream>
#include <algorithm>
#include<cstdio>
#define M 100001
using namespace std;
struct node
{
int s,aa,bb;
};node tree[(M<<)+];
int a[M],b[M];
int n,len,kk;
int main()
{
freopen("jh.in","r",stdin);
cin>>n;
for(int i=;i<=n;i++)cin>>a[i];
for(int i=;i<=n;i++)cin>>b[i];
sort(a+,a+n+);
sort(b+,b+n+);
for(int i=;i<=n;i++)
{
tree[i].aa=i;
tree[i].bb=;
tree[i].s=a[i]+b[];
}
len=n;
while()
{
cout<<tree[].s<<" ";
kk++;
tree[].bb++;
tree[].s=a[tree[].aa]+b[tree[].bb];
if(tree[].bb>n)tree[].s=1e9;
int q=;
while()
{
int q1=q<<,q2=q1+;
if(q1>len)break;
if(q2<=len&&tree[q2].s<tree[q1].s)q1=q2;
if(tree[q].s<=tree[q1].s)break;
else swap(tree[q],tree[q1]);
q=q1;
}
if(kk==n)break;
}
return ;
}
最小的N个和(codevs 1245)的更多相关文章
- AC日记——最小的N个和 codevs 1245
1245 最小的N个和 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题解 查看运行结果 题目描述 Description 有两个长度为 N ...
- codevs 1245 最小的N个和
1245 最小的N个和 http://codevs.cn/problem/1245/ 题目描述 Description 有两个长度为 N 的序列 A 和 B,在 A 和 B 中各任取一个数可以得到 N ...
- CODEVS 1245 最小的N个和 堆+排序
原题链接 http://codevs.cn/problem/1245/ 题目描述 Description 有两个长度为 N 的序列 A 和 B,在 A 和 B 中各任取一个数可以得到 N^2 个和,求 ...
- T1245 最小的N个和 codevs
http://codevs.cn/problem/1245/ 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 有两个长度 ...
- Codevs No.1245 最小的N个和
2016-05-31 18:52:15 题目链接: 最小的N个和 Codevs No.1245 题目大意: 给两个等长数列,各取一个数求和,找到最小的N组 解法: 堆优化的大暴力 直接枚举所有可能在最 ...
- 求最大边/最小边的比值最小的路径 codevs 1001 舒适的路线
codevs 1001 舒适的路线 2006年 时间限制: 2 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description Z小镇是一个景色宜人 ...
- [Codevs 1421]秋静叶&秋穣子(最大-最小博弈)
题目:http://codevs.cn/problem/1421/ 分析:有向树上的最大-最小博弈 先手与后手的策略不同: 先手A:让对方取得尽量少的前提下,自己取得尽量大 后手B:让自己取得尽量多的 ...
- 1245 最小的N个和
1245 最小的N个和 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 有两个长度为 N 的序列 A 和 B, ...
- codevs 2796 最小完全图
2796 最小完全图 http://codevs.cn/problem/2796/ 时间限制: 1 s 空间限制: 128000 KB 题目描述 Description 若一个图的每一对不 ...
随机推荐
- 彻底理解position与anchorPoint
引言 相信初接触到CALayer的人都会遇到以下几个问题: 为什么修改anchorPoint会移动layer的位置?CALayer的position点是哪一点呢?anchorPoint与positio ...
- 架构(Architecture)和框架(Framework)杂谈
1. 架构和框架的设计层次不同 类似于硬件设计,软件设计也分为不同的层次.典型的软件设计层次如下图: 在这个图中我们可以看到,Framework处于Micro-archite ...
- 自动切换的JS菜单
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" > <html xmlns=&quo ...
- U盘10分钟安装linux系统
说来可能不信,10分钟包括创建U盘启动盘,用U盘启动,安装,不联网,不更新,不安装语言包,等装好系统再更新. Windows系统硬盘分区 如果你用的是Windows系统,现有的硬盘没有未分配的空间,需 ...
- C++ 迭代器 基础介绍
C++ 迭代器 基础介绍 迭代器提供对一个容器中的对象的访问方法,并且定义了容器中对象的范围.迭代器就如同一个指针.事实上,C++的指针也是一种迭代器.但是,迭代器不仅仅是指针,因此你不能认为他们一定 ...
- 最近为毛喜欢上C/C++语言了
旁观者李四说:此人大笨也!我用鼠标随便拖几个控件, 就是一个xxx管理系统了,你用C语言怕是一年也写不出来吧! 好吧,我要承认,讲这话的都已经是mS的奴才了,别的我不了解, MFC本身就是一个封闭的架 ...
- 【初级为题,大神绕道】The app icon set named "AppIcon" did not have any applicable content 错误#解决方案#
The app icon set named "AppIcon" did not have any applicable content 错误,怎样解决 按照您的错误提示您应该 ...
- 通过Spring @PostConstruct 和 @PreDestroy 方法 实现初始化和销毁bean之前进行的操作
关于在spring 容器初始化 bean 和销毁前所做的操作定义方式有三种: 第一种:通过@PostConstruct 和 @PreDestroy 方法 实现初始化和销毁bean之前进行的操作 第二 ...
- 用LR12录制app,用LR11跑场景,无并发数限制,已试验过,可行!
免费使用LoadRunner对移动互联网后端服务器压力测试 一.LoadRunner简介 LoadRunner,是惠普公司研发的一款预测系统行为和性能的负载测试工具.通过以模拟上千万用户实施并发负载及 ...
- The CompilerVersion constant identifies the internal version number of the Delphi compiler.
http://delphi.wikia.com/wiki/CompilerVersion_Constant The CompilerVersion constant identifies the in ...