http://poj.org/problem?id=3658
原题在上。
一句话:从最深注入。求每个台子高度1个单位时的时间。
题目要注意的也就是:每个高度都不一样、从最小的注入。也没什么了。
模拟题。数组模拟链表。
在每次更新now的时候顺带将已算出time的台子和谐掉。
将这个和谐掉的台子与左右两侧最低的那个的w合并掉。就是更新最低的那个的宽度。
仅此而已
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 // USACO 2008 January Gold 2 // Artificial Lake 3 // Poj 3658 4 5 program poj3658a; 6 var n,k:longint; 7 h,w,last,next,time:array[0..100001] of longint; 8 9 procedure init; 10 var i,min:longint; 11 begin 12 readln(n); 13 h[0]:=maxlongint; w[0]:=0; 14 h[n+1]:=maxlongint; w[n+1]:=0; 15 min:=maxlongint; k:=0; 16 for i:=1 to n do 17 begin 18 read(w[i],h[i]); 19 next[i]:=i+1; last[i]:=i-1; 20 next[i-1]:=i; last[i+1]:=i; 21 if h[i]<min then begin k:=i; min:=h[i]; end; 22 end; 23 end; 24 25 function low:longint; 26 var l,r:longint; 27 begin 28 l:=last[k]; r:=next[k]; 29 if h[l]<h[r] then 30 begin 31 low:=w[k]*(h[l]-h[k]); 32 w[l]:=w[l]+w[k]; 33 k:=l; 34 end 35 else 36 begin 37 low:=w[k]*(h[r]-h[k]); 38 w[r]:=w[r]+w[k]; 39 k:=r; 40 end; 41 end; 42 43 procedure main; 44 var i,now:longint; 45 begin 46 now:=0; 47 for i:=1 to n do time[i]:=0; 48 for i:=1 to n do 49 begin 50 while h[last[k]]<h[k] do k:=last[k]; 51 while h[next[k]]<h[k] do k:=next[k]; 52 time[k]:=now+w[k]; 53 next[last[k]]:=next[k]; 54 last[next[k]]:=last[k]; 55 now:=now+low; 56 end; 57 for i:=1 to n do writeln(time[i]); 58 end; 59 60 Begin 61 assign(input,'usaco.in'); reset(input); 62 assign(output,'usaco.out'); rewrite(output); 63 64 init; 65 main; 66 67 close(input); close(output); 68 End.
提供一组数据:
input |
9 |
output |
10 |
送个图。
========
http://ace.delos.com/TESTDATA/JAN08_5.htm
本题USACO 的官方数据。
我就纳闷儿了。 为啥我的可以过这个官方数据。
就是过不了POJ的数据呢?!!!
求解……