刚刚做出这道题,感觉很兴奋啊,对于我这种弱菜来说能完美的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

合并果子(Vijos P1097)相关推荐

  1. Vijos P1097 合并果子【哈夫曼树+优先队列】

    描述 在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆.多多决定把所有的果子合成一堆. 每一次合并,多多可以把两堆果子合并到一起,消耗的体力等于两堆果子的重量之和.可以看 ...

  2. Vijos p1097 合并果子

    描述: 在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆.多多决定把所有的果子合成一堆. 每一次合并,多多可以把两堆果子合并到一起,消耗的体力等于两堆果子的重量之和.可以 ...

  3. [LUOGU] 1090 合并果子

    题目描述在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆.多多决定把所有的果子合成一堆.每一次合并,多多可以把两堆果子合并到一起,消耗的体力等于两堆果子的重量之和.可以看 ...

  4. 合并果子(NOIP2004)

    合并果子(NOIP2004) [问题描述] 在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了 不同的堆.多多决定把所有的果子合成一堆.每一次合并,多多可以把两堆果子 合并到一起, ...

  5. SDUT 2127 树-堆结构练习——合并果子之哈夫曼树(优先队列)

    树-堆结构练习--合并果子之哈夫曼树 Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Problem Description ...

  6. sdut 2127 树-堆结构练习——合并果子之哈夫曼树 优先队列

    Problem Description 在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆.多多决定把所有的果子合成一堆. 每一次合并,多多可以把两堆果子合并到一起,消耗的 ...

  7. PAT甲级1125 Chain the Ropes:[C++题解]贪心、优先队列、合并果子

    文章目录 题目分析 题目来源 题目分析 来源:acwing 板子题:合并果子合并果子优先队列 分析:贪心策略是: 每次取最短的两条绳子a和b.该两条绳子合并为1条绳子,且长度变为a+b2\frac{a ...

  8. 树-堆结构练习——合并果子之哈夫曼树

    树-堆结构练习--合并果子之哈夫曼树 Description 在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆.多多决定把所有的果子合成一堆. 每一次合并,多多可以把两堆 ...

  9. 合并果子_tyvj1066_vijos1097_codevs1063_贪心+堆

    描述 在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆.多多决定把所有的果子合成一堆. 每一次合并,多多可以把两堆果子合并到一起,消耗的体力等于两堆果子的重量之和.可以看 ...

  10. SDNU 1171.合并果子(区间dp)

    Description 在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆.多多决定把所有的果子合成一堆.  每一次合并,多多可以把两堆果子合并到一起,消耗的体力等于两堆果 ...

最新文章

  1. SIFT特征及特征匹配:SIFT and feature matching
  2. 终端软件_DMSTerminal现场管控终端软件正式发布
  3. ubuntu mysql下载64位下载_ubuntu mysql下载|
  4. conda创建环境速度慢解决办法
  5. duilib消息类型
  6. 程序员「在知乎装逼被怼」,决定用『面试』证明自己
  7. 哈夫曼树实现:统计文本信息,构造哈夫曼树,并对其进行编码与解码
  8. 杭电校赛(油菜花王国)
  9. Android -- 创建数据库到SD卡
  10. 在一家虚拟现实公司工作是什么感受?
  11. 计算机网络常见面试题目总结,含答案
  12. Go:pythagoras毕达哥拉斯算法(附完整源码)
  13. dx.bat转换jar 包(java 1.8)出现 unsupported class file version 52.0 …while parsing
  14. 小米平板2刷哪个系统更流畅_小米平板2 Windows版本评测:流畅度不如MIUI 7版 胜在更智能...
  15. 距离度量对传统萤火虫算法开发特性和收敛行为的性能分析(Matlab代码实现)
  16. 莫言用 ChatGPT 写颁奖辞;微软CEO反驳马斯克:我们没有控制OpenAI;SQLite 3.42.0 发布|极客头条
  17. 阿里云开放搜索案例(opensearch )
  18. 维宏系统修改端口位置操作说明
  19. wemall app商城源码Android之支付宝接口RSA函数
  20. java udp nio_Java NIO系列教程(十) Java NIO DatagramChannel

热门文章

  1. hping3工具DOS攻击实验
  2. 增加表空间大小的四种方法
  3. ElastciSearch简单总结(笔记)
  4. 用习惯了windows系统要怎样去认识linux系统(一)
  5. jQ效果:简单的手风琴效果
  6. Android界面菜单(4)—快捷菜单
  7. 解决SQL命令行回退的问题
  8. 听小鹏讲废话之OSI
  9. python 数据科学 包_什么时候应该使用哪个Python数据科学软件包?
  10. leetcode 1002. 查找常用字符