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. Anytime项目开发记录4

    做事情列表,我在程序中命名为“正在做”. 这是一个Fragment,应用的主页面,由一个MainActivity加上DoingListFragment和PersonFragment组成.PersonF ...

  2. FJWC 2019 游记

    FJWC 2019 游记 Day 0 春节旅游, 刚从杭州绍兴一带赶回来, 然而并没有直接飞去福州, 去了厦门再去福州, 浪费了好多时间. Day 1 酒店到学校有 \(20\) 分钟的步行路程, 感 ...

  3. MySQL初始4--去重

    更新表中的字段: update 表名 set 字段=新值,… where 条件: UPDATE语法可以用新值更新原有表行中的各列.SET子句指示要修改哪些列和要给予哪些值.WHERE子句指定应更新哪些 ...

  4. 简单dp总结

    ### 简单dp总结 本文是阅读<挑战程序设计第二版>其中关于dp章节所作总结.将简要描述dp的部分知识. 一.dp是什么? dp在计算机专业学科中全称是动态规划(dynamic prog ...

  5. [Elasticsearch] 多字段搜索 (六) - 自定义_all字段,跨域查询及精确值字段

    自定义_all字段 在元数据:_all字段中,我们解释了特殊的_all字段会将其它所有字段中的值作为一个大字符串进行索引.尽管将所有字段的值作为一个字段进行索引并不是非常灵活.如果有一个自定义的_al ...

  6. 搭建Lepus数据库监控系统

    一.  安装环境 系统环境:centos6.5 IP:192.168.30.242 hostname:vpn.org 软件:LAMP均已安装.(请确保这些正常安装,并能使用). 系统核心包:(摘自官方 ...

  7. [C/C++] extern关键字详解以及与static、const区别

    extern用法详解: 1. 声明外部实体 声明外部全局变量或对象,一般用于头文件中,表示在其它编译单元内定义的变量,链接时进行外部链接,如: extern int ivalue; 此时的extern ...

  8. [Java] Java常见错误

    1.处理java错误"编码 GBK 的不可映射字符" (1)首先记事本打开java源文件 (2)然后另存为,选择ANSI编码 (3)覆盖 (4)再试一下,ok,编译通过.

  9. Struts1文件上传

    package org.zln.struts.domain; import org.apache.struts.upload.FormFile; /** * Created by sherry on ...

  10. 【bzoj3196】Tyvj 1730 二逼平衡树 线段树套Treap

    题目描述 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:1.查询k在区间内的排名2.查询区间内排名为k的值3.修改某一位值上的数值4.查询k在区间内的前驱(前驱定义 ...