1. 程式人生 > >題解:HNOI2002 營業額統計

題解:HNOI2002 營業額統計

工作 flow keyword nbsp 管理 soft min pad nco

題目描述

Tiger最近被公司升任為營業部經理,他上任後接受公司交給的第一項任務便是統計並分析公司成立以來的營業情況。

Tiger拿出了公司的賬本,賬本上記錄了公司成立以來每天的營業額。分析營業情況是一項相當復雜的工作。由於節假日,大減價或者是其他情況的時候,營業額會出現一定的波動,當然一定的波動是能夠接受的,但是在某些時候營業額突變得很高或是很低,這就證明公司此時的經營狀況出現了問題。經濟管理學上定義了一種最小波動值來衡量這種情況:

當最小波動值越大時,就說明營業情況越不穩定。

而分析整個公司的從成立到現在營業情況是否穩定,只需要把每一天的最小波動值加起來就可以了。你的任務就是編寫一個程序幫助Tiger來計算這一個值。

第一天的最小波動值為第一天的營業額。

該天的最小波動值=min{|該天以前某一天的營業額-該天營業額|}。

解題思路:

這道題可以用離線鏈表解決,先一次性讀到最後一個,再根據讀入的順序刪除加進來的高度

 1var
2 answer,height,previous,next:array[0..40005] of longint;
3 rank:array[0..40005] of longint;
4 n,higher,shorter,i,maxn,sum:longint;
5procedure sort(l,r:longint);
6var
7 x,i,j,tmp:longint;
8
begin
9 x:=height[rank[(l+r) div 2]];i:=l;j:=r;
10 while i<=j do
11 begin
12 while height[rank[i]] < x do
13 inc(i);
14 while height[rank[j]] > x do
15 dec(j);
16 if i<=j then
17 begin
18 //swap(rank[i],rank[j]);
19 tmp:=rank[i];
20
rank[i]:=rank[j];
21 rank[j]:=tmp;
22 inc(i); dec(j);
23 end;
24 end;
25 if i<r then sort(i,r);
26 if l<j then sort(l,j);
27end;
28begin
29 maxn:=40005;
30 readln(n);
31 for i:=1 to n do
32 begin
33 read(height[i]);
34 rank[i]:=i;
35 end;
36 sort(1,n);
37 for i:=1 to n do
38 begin
39 previous[rank[i]]:=rank[i-1];
40 next[rank[i]]:=rank[i+1];
41 end;
42 for i:=n downto 2 do
43 begin
44 higher:=1023456789; shorter:=1023456789;
45 if previous[i]<>0 then
46 shorter:=height[i] - height[previous[i]];
47 if next[i]<>0 then
48 higher:=height[next[i]]-height[i];
49 if shorter < higher then
50 answer[i]:=previous[i] else
51 answer[i]:=next[i];
52 next[previous[i]]:=next[i];
53 previous[next[i]]:=previous[i];
54 end;
55 sum:=height[1];
56 for i:=2 to n do
57 sum:=sum+(abs(height[i]-height[answer[i]]));
58 // sum:=sum+answer[i];
59 //writeln(sum);
60 writeln(sum);
61end.

題解:HNOI2002 營業額統計