合并果子(Vijos P1097)
剛剛做出這道題,感覺很興奮啊,對(duì)于我這種弱菜來說能完美的AC這道題真是令人振奮不已啊!
(情不自禁的將AC記錄發(fā)上來了,勿怪勿怪!)
這道題是我們向總點(diǎn)名要做的,這幾天學(xué)了很多新內(nèi)容,于是乎拖到了今天才做。
由于剛剛學(xué)了堆排序,仔細(xì)一看這道題的描述,感覺用堆排序來做真是再合適不過了(網(wǎng)上貌似有很多做法,快排什么,有機(jī)會(huì)換個(gè)算法編一下),因?yàn)橹恍枰獙⒑喜a(chǎn)生的數(shù)據(jù)放入堆中篩一遍即可。
剛開始認(rèn)為只不過是簡(jiǎn)單的將堆排序中將第一個(gè)置換為最后一個(gè),并將dec(記錄指針,2)就可以了。就這樣隨便整了一下就交上去了,發(fā)現(xiàn)只有10分(說到這個(gè)10分,某位大神還以為是哪個(gè)小地方出了問題,結(jié)果我一看測(cè)試數(shù)據(jù),發(fā)現(xiàn)對(duì)的那個(gè)點(diǎn)就是題目給出的例子,蛋疼有木有???)。
冥思苦想了好一會(huì),終于想明白了不要一次性將第一第二兩個(gè)值全換掉,這樣堆篩下來無法得到正確的序列。先將最后一個(gè)置換為第一個(gè),篩一遍,由于篩過后排在第一個(gè)的數(shù)據(jù)一定是剛剛第二小的數(shù)據(jù),只需要用剛剛記錄下來的x[1]+x[2]將其置換即可。
務(wù)必記在在dec(指針)之前將當(dāng)前指向的數(shù)據(jù)賦值為maxlongint,否則會(huì)造成嚴(yán)重后果,就是被這個(gè)卡了好久(因?yàn)閿?shù)組很大,之后的數(shù)據(jù)全部為0,會(huì)造成將0置換上來的情況,置為maxlongint便不會(huì)出現(xiàn)這個(gè)問題)。
廢話不多說,直接上源代碼:
?
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; 【這一步很重要,否則會(huì)出現(xiàn)上文提到的結(jié)果】 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
轉(zhuǎn)載于:https://www.cnblogs.com/cszyt/archive/2012/10/05/2712452.html
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的合并果子(Vijos P1097)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: VB2010中的MediaPlayer控
- 下一篇: Yii2 的快速配置 api 服务 yi