最小的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 若一个图的每一对不 ...
随机推荐
- [NOIP1997] P2626 斐波那契数列(升级版)
题目背景 大家都知道,斐波那契数列是满足如下性质的一个数列: • f(1) = 1 • f(2) = 1 • f(n) = f(n-1) + f(n-2) (n ≥ 2 且 n 为整数). 题目描述 ...
- ubuntu安装spark
1.先得准备环境,需要JAVA环境,还有Python环境(默认会有) JAVA下载JDK之后配置JAVA环境变量 export JAVA_HOME=/opt/jdk1..0_45 export JRE ...
- configure: error: Please reinstall the libcurl distribution
configure: error: Please reinstall the libcurl distribution - easy.h should be in /include/curl/ 基本上 ...
- Recruit Coupon Purchase Winner's Interview: 2nd place, Halla Yang
Recruit Coupon Purchase Winner's Interview: 2nd place, Halla Yang Recruit Ponpare is Japan's leading ...
- Jenkins 搭建U3D自动发布 Android
工具 [u3d相关的PostProcessBuildPlayer,PerformBuild.cs] 1.Jenkins 开源包 Java -jar jenkins.war,参考链接 http://w ...
- centos命令
alt + z 打开终端(自定义命令) su 切换到root
- C# ManualResetEvent的使用
using System; using System.Threading; public class Example { // mre is used to block and release thr ...
- vsftpd 搭建与介绍
CentOS Linux Vsftp服务器配置 CentOS Linux Vsftp服务器配置 1.开启防火墙ftp端口 vi /etc/sysconfig/iptables ...
- 字符串模拟赛T3
只看我的做法就够了 #include<iostream> #include<cstdio> #include<string> #include<cstring ...
- Crashing Robots(imitate)
Crashing Robots Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 8124 Accepted: 3528 D ...