http://poj.org/problem?id=3658

原题在上。

一句话:从最深注入。求每个台子高度1个单位时的时间。

题目要注意的也就是:每个高度都不一样、从最小的注入。也没什么了。

模拟题。数组模拟链表。

在每次更新now的时候顺带将已算出time的台子和谐掉。

将这个和谐掉的台子与左右两侧最低的那个的w合并掉。就是更新最低的那个的宽度。

仅此而已

 

View Code
 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
1 2
1 6
1 4
1 8
1 1
1 9
1 7
1 3
1 5

output  

10
16
8
24
1
45
33
25
28

送个图。 

 

 

========

http://ace.delos.com/TESTDATA/JAN08_5.htm

 

本题USACO 的官方数据。

 

我就纳闷儿了。 为啥我的可以过这个官方数据。

就是过不了POJ的数据呢?!!!

求解……