合并果子(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
合并果子(Vijos P1097)相关推荐
- Vijos P1097 合并果子【哈夫曼树+优先队列】
描述 在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆.多多决定把所有的果子合成一堆. 每一次合并,多多可以把两堆果子合并到一起,消耗的体力等于两堆果子的重量之和.可以看 ...
- Vijos p1097 合并果子
描述: 在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆.多多决定把所有的果子合成一堆. 每一次合并,多多可以把两堆果子合并到一起,消耗的体力等于两堆果子的重量之和.可以 ...
- [LUOGU] 1090 合并果子
题目描述在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆.多多决定把所有的果子合成一堆.每一次合并,多多可以把两堆果子合并到一起,消耗的体力等于两堆果子的重量之和.可以看 ...
- 合并果子(NOIP2004)
合并果子(NOIP2004) [问题描述] 在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了 不同的堆.多多决定把所有的果子合成一堆.每一次合并,多多可以把两堆果子 合并到一起, ...
- SDUT 2127 树-堆结构练习——合并果子之哈夫曼树(优先队列)
树-堆结构练习--合并果子之哈夫曼树 Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Problem Description ...
- sdut 2127 树-堆结构练习——合并果子之哈夫曼树 优先队列
Problem Description 在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆.多多决定把所有的果子合成一堆. 每一次合并,多多可以把两堆果子合并到一起,消耗的 ...
- PAT甲级1125 Chain the Ropes:[C++题解]贪心、优先队列、合并果子
文章目录 题目分析 题目来源 题目分析 来源:acwing 板子题:合并果子合并果子优先队列 分析:贪心策略是: 每次取最短的两条绳子a和b.该两条绳子合并为1条绳子,且长度变为a+b2\frac{a ...
- 树-堆结构练习——合并果子之哈夫曼树
树-堆结构练习--合并果子之哈夫曼树 Description 在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆.多多决定把所有的果子合成一堆. 每一次合并,多多可以把两堆 ...
- 合并果子_tyvj1066_vijos1097_codevs1063_贪心+堆
描述 在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆.多多决定把所有的果子合成一堆. 每一次合并,多多可以把两堆果子合并到一起,消耗的体力等于两堆果子的重量之和.可以看 ...
- SDNU 1171.合并果子(区间dp)
Description 在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆.多多决定把所有的果子合成一堆. 每一次合并,多多可以把两堆果子合并到一起,消耗的体力等于两堆果 ...
最新文章
- SIFT特征及特征匹配:SIFT and feature matching
- 终端软件_DMSTerminal现场管控终端软件正式发布
- ubuntu mysql下载64位下载_ubuntu mysql下载|
- conda创建环境速度慢解决办法
- duilib消息类型
- 程序员「在知乎装逼被怼」,决定用『面试』证明自己
- 哈夫曼树实现:统计文本信息,构造哈夫曼树,并对其进行编码与解码
- 杭电校赛(油菜花王国)
- Android -- 创建数据库到SD卡
- 在一家虚拟现实公司工作是什么感受?
- 计算机网络常见面试题目总结,含答案
- Go:pythagoras毕达哥拉斯算法(附完整源码)
- dx.bat转换jar 包(java 1.8)出现 unsupported class file version 52.0 …while parsing
- 小米平板2刷哪个系统更流畅_小米平板2 Windows版本评测:流畅度不如MIUI 7版 胜在更智能...
- 距离度量对传统萤火虫算法开发特性和收敛行为的性能分析(Matlab代码实现)
- 莫言用 ChatGPT 写颁奖辞;微软CEO反驳马斯克:我们没有控制OpenAI;SQLite 3.42.0 发布|极客头条
- 阿里云开放搜索案例(opensearch )
- 维宏系统修改端口位置操作说明
- wemall app商城源码Android之支付宝接口RSA函数
- java udp nio_Java NIO系列教程(十) Java NIO DatagramChannel