2013-09-08 10:12

LRJ的算法竞赛入门经典训练指南里有类似的题,原题要难很多,p189页

读入A,B两组中的所有数后,建立N个有序表:

A1+B1<A2+B1<A3+B1<...<AN+B1

A1+B2<A2+B2<A3+B2<...<AN+B2

...

A1+BN<A2+BN<A3+BN<...<AN+AN

将每个有序表的第一个数字(记作s)连同A,B的下标0推入优先队列,这样我们每一次取出队列中的队首,显然这个元素的s是最小的,输出。与此同时,我们需要延续这个有序表。在取出的结构体中,令其标号a加1,b的标号不变,那么,s=B[b]+A[a]。

实际操作时,因为b的标号不变,就可以不保存下标b以及数组B,直接将读入数组B改为读入每一个元素(记为k),并将s=k+a[1],a=1推入队列,每次取出元素后,令其a=a+1,s=s+A[a]-A[a-1],如此减少空间占用,只需要一个队列和一个保存A的数组

//By BLADEVIL
type
aa=record
num :array[..] of longint;
end;
bb=record
num,size :longint; end; var
x, y :aa;
n :longint;
heap :array[..] of bb;
t :longint; procedure swap(var a,b:longint);
var
z :longint;
begin
z:=a; a:=b; b:=z;
end; procedure qs(var xx:aa; low,high:longint);
var
i, j, z, c :longint;
begin
i:=low; j:=high; c:=xx.num[(i+j) div ];
while i<j do
begin
while c<xx.num[j] do dec(j);
while c>xx.num[i] do inc(i);
if i<=j then
begin
swap(xx.num[i],xx.num[j]);
inc(i); dec(j);
end;
end;
if i<high then qs(xx,i,high);
if j>low then qs(xx,low,j);
end; procedure init;
var
i :longint;
begin
read(n);
for i:= to n do read(x.num[i]);
for i:= to n do read(y.num[i]);
qs(x,,n);
qs(y,,n);
end; procedure up(x:longint);
begin
while (x>) and (heap[x].num<heap[x div ].num) do
begin
swap(heap[x].num,heap[x div ].num);
swap(heap[x].size,heap[x div ].size);
x:=x div ;
end;
end; procedure down(x:longint);
var
k :longint;
begin
k:=x;
while true do
begin
if (x<<<=t) and (heap[k].num>heap[x<<].num) then k:=x<<;
if (x<<+<=t) and (heap[k].num>heap[x<<+].num) then k:=x<<+;
if k=x then exit;
swap(heap[x].num,heap[k].num);
swap(heap[x].size,heap[k].size);
x:=k;
end;
end; procedure main;
var
i :longint;
begin
t:=;
for i:= to n do
begin
inc(t);
heap[t].num:=x.num[i]+y.num[];
heap[t].size:=;
up(t);
end;
for i:= to n do
begin
write(heap[].num,' ');
inc(t);
heap[t].num:=heap[].num-y.num[heap[].size]+y.num[heap[].size+];
heap[t].size:=heap[].size+;
up(t);
heap[].num:=heap[t].num;
heap[].size:=heap[t].size;
dec(t);
down(); end;
writeln;
end; begin
init;
main;
end.

wikioi 1245最小的N个和的更多相关文章

  1. codevs 1245 最小的N个和

    1245 最小的N个和 http://codevs.cn/problem/1245/ 题目描述 Description 有两个长度为 N 的序列 A 和 B,在 A 和 B 中各任取一个数可以得到 N ...

  2. 1245 最小的N个和

    1245 最小的N个和 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond         题目描述 Description 有两个长度为 N 的序列 A 和 B, ...

  3. 1245 最小的N个和(前k小ai+bi)

    1245 最小的N个和  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond 题解  查看运行结果     题目描述 Description 有两个长度为 N ...

  4. code vs 1245 最小的N个和

    1245 最小的N个和  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond 题解       题目描述 Description 有两个长度为 N 的序列 A ...

  5. Codevs No.1245 最小的N个和

    2016-05-31 18:52:15 题目链接: 最小的N个和 Codevs No.1245 题目大意: 给两个等长数列,各取一个数求和,找到最小的N组 解法: 堆优化的大暴力 直接枚举所有可能在最 ...

  6. CODEVS 1245 最小的N个和 堆+排序

    原题链接 http://codevs.cn/problem/1245/ 题目描述 Description 有两个长度为 N 的序列 A 和 B,在 A 和 B 中各任取一个数可以得到 N^2 个和,求 ...

  7. AC日记——最小的N个和 codevs 1245

    1245 最小的N个和  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond 题解  查看运行结果     题目描述 Description 有两个长度为 N ...

  8. 最小的N个和(codevs 1245)

    1245 最小的N个和  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond 题解  查看运行结果     题目描述 Description 有两个长度为 N ...

  9. codevs 必做:堆:1245、2879 并查集:1069、1074、1073

    1245 最小的N个和  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond 题解  查看运行结果     题目描述 Description 有两个长度为 N ...

随机推荐

  1. java_hdfs之读写文件

    package hdfsTest.answer.hdfs; import java.io.IOException; import java.net.URI; //import java.net.URL ...

  2. Scala学习笔记(四):从文件里读取文本行

    第一个版本: import scala.io.Source if(args.length>0){ for(line<-Source.fromFile(args(0)).getLines) ...

  3. (1)分布式下的爬虫Scrapy应该如何做-安装

    关于Scrapy的安装,网上一搜一大把,一个一个的安装说实话是有点麻烦,那有没有一键安装的?答案显然是有的,下面就是给神器的介绍: 主页:http://conda.pydata.org/docs/ 下 ...

  4. javascript中容易出bug的语句

    一.forEach方法 forEach方法中没法用continue来实现跳过单句到下一次循环,如果要跳到下一次循环,要用return关键字,如果想直接跳出forEach循环,具我所知的,要throw一 ...

  5. 【UML】活动图介绍

    1.活动图,即Activity Diagram,是UML中用于对系统的动态行为建模的一种常用工具,它描述活动的顺序,展现从一种活动到另一种活动的控制流.其本质上是一种流程图,着重表现从一个活动到另一个 ...

  6. css如何选择相同class下的第一个class元素和最后一个元素?

    如图,如果像选择类名为  class="exerciseInfo"  中的第一个和最后一个div,做法如下: 选择第一个类名: .exerciseInfo: nth-of-type ...

  7. winspool.drv

    public partial class Form1 : Form{ [System.Runtime.InteropServices.DllImportAttribute("winspool ...

  8. WebKit 渲染过程

    webkit笔记,主要来自 朱永盛 <WebKit技术内幕> 学习笔记,转载就注明原著,该书是国内仅有的Webkit内核的书籍,学习的好导师,推荐有兴趣的朋友可以购买 Webkit渲染过程 ...

  9. Configuring Dojo with dojoConfig - The Dojo Toolkit

    转载自Dojo官网 Configuring Dojo with dojoConfig The dojoConfig object (formerly djConfig) allows you to s ...

  10. P4109 [HEOI2015]定价

    题目描述 在市场上有很多商品的定价类似于 999 元.4999 元.8999 元这样.它们和 1000 元.5000 元和 9000 元并没有什么本质区别,但是在心理学上会让人感觉便宜很多,因此也是商 ...