您的位置:首页 > 其它

营业额统计 2011-12-20

2016-03-02 20:04 369 查看
营业额统计

(turnover.exe)

Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况。

Tiger 拿出了公司的账本,账本上记录了公司成立以来每天的营业额。分析营业情况是一项相当复杂的工作。由于节假日,大减价或者是其他情况的时候,营业额会出现一 定的波动,当然一定的波动是能够接受的,但是在某些时候营业额突变得很高或是很低,这就证明公司此时的经营状况出现了问题。经济管理学上定义了一种最小波 动值来衡量这种情况:

该天的最小波动值

当最小波动值越大时,就说明营业情况越不稳定。

而分析整个公司的从成立到现在营业情况是否稳定,只需要把每一天的最小波动值加起来就可以了。你的任务就是编写一个程序帮助Tiger来计算这一个值。

第一天的最小波动值为第一天的营业额。

l 输入输出要求

输入由文件’turnover.in’读入。

第一行为正整数,表示该公司从成立一直到现在的天数,接下来的n行每行有一个正整数,表示第i天公司的营业额。

输出到文件’turnover.out’。

输出文件仅有一个正整数,即。结果小于。

l 输入输出样例

Turnover.in

Turnover.out

6

5

1

2

5

4

6

12

结果说明:5+|1-5|+|2-1|+|5-5|+|4-5|+|6-5|=5+4+1+0+1+1=12

————————————————————————

平衡树优化。

————————————————————————

Program Stone;

var i,j,k,n,root,qu,ji:longint;

a:array[0..50000]of longint;

t,lc,rc,f:array[0..50000]of longint;

ans:int64;

procedure rightturn(x:longint);   //右旋

var i,j:longint;

begin

i:=f[x];

if lc[f[i]]=i then lc[f[i]]:=x else rc[f[i]]:=x;

f[x]:=f[i];

lc[i]:=rc[x];

f[lc[i]]:=i;

rc[x]:=i;

f[i]:=x;

end;

procedure leftturn(x:longint);    //左旋

var i:longint;

begin

i:=f[x];

if lc[f[i]]=i then lc[f[i]]:=x else rc[f[i]]:=x;

f[x]:=f[i];

rc[i]:=lc[x];

f[rc[i]]:=i;

lc[x]:=i;

f[i]:=x;

end;

procedure findleft(x:longint);     //寻找前驱,即寻找根节点的左子树中最大的节点

begin

if rc[x]=0 then qu:=x else findleft(rc[x]);

end;

procedure findright(x:longint);      //寻找后继,即寻找根节点的右子树中的最小节点

begin

if lc[x]=0 then ji:=x else findright(lc[x]);

end;

procedure add(x,o:longint);     //在二叉树中添加一个节点

var i,j,k:longint;

begin

if a[o]>=a[x] then begin

if rc[x]=0 then begin rc[x]:=o;f[o]:=x;end      //判断是否可以插入节点。

else add(rc[x],o);

end

else begin

if lc[x]=0 then begin lc[x]:=o;f[o]:=x;end

else add(lc[x],o);

end;

end;

procedure promote(x:longint);     //splay旋转。共六种旋转方式

var i,j,k:longint;

begin

k:=f[x];

if x=lc[k] then begin

if f[k]=0 then rightturn(x)

else if lc[f[k]]=k then begin

rightturn(k);

rightturn(x);

end

else begin

rightturn(x);

leftturn(x);

end;

end

else begin

if f[k]=0 then leftturn(x)

else if rc[f[k]]=k then begin

leftturn(k);

leftturn(x);

end

else begin

leftturn(x);

rightturn(x);

end;

end;

end;

function min(a,b:longint):longint;

begin

if a<b then min:=a else min:=b;

end;

Begin

assign(input,'turnover.in');assign(output,'turnover.out');

reset(input);rewrite(output);

readln(n);

readln(a[1]);

ans:=a[1];root:=1;

for i:=2 to n do

begin

readln(a[i]);

add(root,i);

while f[i]<>0 do promote(i);    //将i节点旋转到根

root:=i;

findleft(lc[i]);

findright(rc[i]);

inc(ans,min(abs(a[qu]-a[i]),abs(a[ji]-a[i])));

end;

writeln(ans);

close(input);close(output);

end.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: