合并果子(Vijos P1097)

  刚刚做出这道题,感觉很兴奋啊,对于我这种弱菜来说能完美的AC这道题真是令人振奋不已啊!

  (情不自禁的将AC记录发上来了,勿怪勿怪!)

  这道题是我们向总点名要做的,这几天学了很多新内容,于是乎拖到了今天才做。

  由于刚刚学了堆排序,仔细一看这道题的描述,感觉用堆排序来做真是再合适不过了(网上貌似有很多做法,快排什么,有机会换个算法编一下),因为只需要将合并产生的数据放入堆中筛一遍即可。

  刚开始认为只不过是简单的将堆排序中将第一个置换为最后一个,并将dec(记录指针,2)就可以了。就这样随便整了一下就交上去了,发现只有10分(说到这个10分,某位大神还以为是哪个小地方出了问题,结果我一看测试数据,发现对的那个点就是题目给出的例子,蛋疼有木有???)。

  冥思苦想了好一会,终于想明白了不要一次性将第一第二两个值全换掉,这样堆筛下来无法得到正确的序列。先将最后一个置换为第一个,筛一遍,由于筛过后排在第一个的数据一定是刚刚第二小的数据,只需要用刚刚记录下来的x[1]+x[2]将其置换即可。

  务必记在在dec(指针)之前将当前指向的数据赋值为maxlongint,否则会造成严重后果,就是被这个卡了好久(因为数组很大,之后的数据全部为0,会造成将0置换上来的情况,置为maxlongint便不会出现这个问题)。

  废话不多说,直接上源代码:

 

 1 program duipaixu2;
 2 type
 3         arr=array[1..10001] of longint;
 4 var
 5         x:arr;
 6         i,j,j1,n:longint;
 7         bool:boolean;
 8         s,s1:int64;
 9 procedure heap(var x:arr;j,i:longint);【堆排序】
10 var
11         i2,t1:longint;
12 begin
13         t1:=x[i];
14         i2:=2*i;
15         while  i2<=j do
16         begin
17                 if (i2<=j) and (x[i2] > x[i2+1]) then i2:=i2+1;
18                 if t1 > x[i2] then
19                 begin
20                         x[i]:=x[i2];
21                         i:=i2;i2:=2*i;
22                 end
23                 else i2:=j+1;
24         end;
25         x[i]:=t1;
26 end;
27 {================== main =====================}
28 begin
29         assign(input,'hebin.in');
30         assign(output,'hebin.out');
31         reset(input);
32         rewrite(output);
33         read(n);
34         for i:=1 to n do
35                 read(x[i]);
36         x[n+1]:=maxlongint;
37         j:=n;
38         s:=0;
39         s1:=0;
40         for i:=n div 2 downto 1 do  【建立新堆】
41                         heap(x,n,i);
42         repeat
43                 bool:=true;
44                 if x[2]<=x[3] then
45                 begin
46                         s1:=x[1]+x[2];
47                         s:=s+s1;
48                 end
49                 else begin s1:=x[1]+x[3];s:=s+s1 end;
50                 j1:=j;
51                 dec(j);
52                 if j>1 then
53                 begin
54                         x[1]:=x[j1];
55                         x[j1]:=maxlongint; 【这一步很重要,否则会出现上文提到的结果】
56                         heap(x,j,1);    【分两次筛】
57                         x[1]:=s1;
58                         heap(x,j,1);
59                 end;
60         until j=1;
61         write(s);
62         close(input);
63         close(output);
64 end.

By ZYT

12.10.05

转载于:https://www.cnblogs.com/cszyt/archive/2012/10/05/2712452.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/409521.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vim 删除行_【收藏】138条 Vim 命令、操作、快捷键全

关注我&#xff0c;你的眼睛会怀孕命令历史以:和/开头的命令都有历史纪录&#xff0c;可以首先键入:或/然后按上下箭头来选择某个历史命令。启动vim在命令行窗口中输入以下命令即可vim 直接启动vimvim filename 打开vim并创建名为filename的文件文件命令打开单个文件vim file同…

matlab 按钮组设置,MATLAB中的单选按钮和按钮组

MATLAB GUI中的单选按钮和按钮组matlabGUI界面中的单选(radiobutton)按钮不提供互斥功能&#xff0c;要通过程序实现。方法一&#xff1a;假设有3个radiobutton&#xff0c;分别为radiobutton1、radiobutton2、radiobutton3。radiobutton1的回调函数&#xff1a;functionradiob…

十年只为一个摧残的梦(转载)

第一篇《十年只为一个摧残的梦》 一&#xff1a; 这10年&#xff0c;一定要有自己的方向 1.没有方向感&#xff0c;是最要命的 2.不管起点有多低&#xff0c;都要坦然接受  3.围绕自己的兴趣爱好选择职业 4.做自己最擅长的事 5.从最容易实现的目标开始做起 二&#xff1a; 这…

mysql的join算法,Mysql Join 连接算法

Join 语句的两种算法&#xff0c;分别是 Index Nested-Loop Join(NLJ) 和 Block Nested-Loop Join(BNL)。直接使用join mysql 优化器自动选择 驱动表。从驱动表读入数据&#xff0c;然后根据连接字段&#xff0c;根据条件匹配被驱动表&#xff0c;然后返回结果集&#xff0c;重…

vlookup练习_那个vlookup,我总是学不会啊

在Excel函数中&#xff0c;有那么的一个万金油Excel函数&#xff0c;它既可以正向查找&#xff0c;逆向查找&#xff0c;还可以多条件查找&#xff0c;它就是Vlookup。Vlookup与IF、sumifs/countifs誉为四大必学Excel函数。以下内容节选自【快速入门Excel基础教程】中的第4-2章…

php 数组课件,php学习 数组课件

下标&#xff1a;数组中的识别名称 也就是字符串或整数在数组中的代号数组中有几个索引值就被称为几维数组。索引值&#xff1a;索引是对数据库表中一列或多列的值进行排序的一种结构。数组分类在PHP数组被分为两种&#xff1a;索引数组&#xff1a;索引(indexed)索引值是整数&…

uniapph5授权成功后返回上一页_记一次授权系统的安全测试

山东泽鹿安全威胁管理 漏洞运营 应急响应原创声明&#xff1a;泽鹿安全原创文章&#xff0c;欢迎转载&#xff0c;请注明出处&#xff01;ID : 秋水拿到授权系统IP&#xff0c;首先测一下目录找后台&#xff0c;Nmap扫一下端口&#xff0c;看看后台是不是在其他端口就可以了…

关于团队项目的一些感想——刘宇翔

技术确实很重要&#xff0c;但跟重要的是配合&#xff0c;毕竟以后写的可不是小项目。做项目&#xff0c;不是为了证明自己有多厉害&#xff0c;要的是团队&#xff0c;不是个人能力&#xff0c;虽然个人能力重要&#xff0c;但学会做人才是最重要的。1.先做代码规范。约定文件…

python编写安装脚本_2. 编写安装脚本

2.编写安装脚本The setup script is the centre of all activity in building, distributing, andinstalling modules using the Distutils. The main purpose of the setup script isto describe your module distribution to the Distutils, so that the variouscommands tha…

直接线性变换 matlab,直接线性变换解法

《直接线性变换解法》由会员分享&#xff0c;可在线阅读&#xff0c;更多相关《直接线性变换解法(72页珍藏版)》请在人人文库网上搜索。1、第七章 直接线性变换解法,Direct Linear Transformation-DLT,主要内容,7.1 概述 7.2 DLT解法的基本关系式 7.3 DLT解法的解算过程 7.4 DL…

【linux】——linux ls命令参数及用法详解---linux显示目录内容命令

linux系统中ls命令的用法详解ls命令是linux下最常用的命令。ls命令就是list的缩写,缺省下ls用来打印出当前目录的清单&#xff0c;如果ls指定其他目录&#xff0c;那么就会显示指定目录里的文件及文件夹清单。通过ls 命令不仅可以查看linux文件夹包含的文件&#xff0c;而且可以…

罗斯蒙特电磁流量计8723说明书_罗斯蒙特8732E电磁流量计故障原因及解决办法!...

今天我们来说说罗斯蒙特8732E电磁流量计的一些基本故障和解决办法&#xff0c;我们在排除电磁流量计的故障时&#xff0c;确定问题至关重要。下面提供了无法正常工作的电磁流量计表现出的常见症状。此表提供了潜在的原因以及为每种症状建议的纠正措施。流量计故障&#xff1a;0…

基于matlab的车流量检测,求解释代码,一段交通车流量检测的代码

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼大神求解释一下代码的意思&#xff0c;通俗点楼主新手啊~while ~isDone(hbfr)[y, cb, cr] step(hbfr);[cb, cr] step(hcr, cb, cr);image step(hcsc, cat(3,y,cb,cr));y im2single(y);y y-mean(y(:));fg_image step(hof, y);…

堆和栈的区别(转过无数次的文章)

一、预备知识—程序的内存分配 一个由C/C编译的程序占用的内存分为以下几个部分 1、栈区&#xff08;stack&#xff09;— 由编译器自动分配释放 &#xff0c;存放函数的参数值&#xff0c;局部变量的值等。其 操作方式类似于数据结构中的栈。 2、堆区&#xf…