程序改变世界,教育改变未来

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况。
Tiger拿出了公司的账本,账本上记录了公司成立以来每天的营业额。分析营业情况是一项相当复杂的工作。由于节假日,大减价或者是其他情况的时候,营业额会出现一定的波动,当然一定的波动是能够接受的,但是在某些时候营业额突变得很高或是很低,这就证明公司此时的经营状况出现了问题。经济管理学上定义了一种最小波动值来衡量这种情况:
该天的最小波动值 = min {该天以前某一天的营业额 - 该天营业额}
当最小波动值越大时,就说明营业情况越不稳定。
而分析整个公司的从成立到现在营业情况是否稳定,只需要把每一天的最小波动值加起来就可以了。你的任务就是编写一个程序帮助Tiger来计算这一个值。
第一天的最小波动值为第一天的营业额。
天数小于100000.

#include<iostream> #include<cstdio> #include<cstring> using namespace std; #define MAXN 100005 #define INF 10000000 int ch[MAXN][2],fa[MAXN],sale[MAXN]; int ans,tot,root; #define min(a,b) ((a)>(b)?(b):(a)) void rotato(int x) { if(x==0||fa[x]==0)return; int y=fa[x],z=fa[y]; bool flag=(ch[y][1]==x); ch[y][flag]=ch[x][!flag]; if(ch[x][!flag])fa[ch[x][!flag]]=x; ch[x][!flag]=y; fa[y]=x; fa[x]=z; if(z)ch[z][ch[z][1]==y]=x; } void splay(int x,int goal) { for(int y;(y=fa[x])!=goal;rotato(x)) { int z; if((z=fa[y])!=goal) { if((ch[z][1]==y)==(ch[y][1]==x)) rotato(y); else rotato(x); } } if(goal==0)root=x; } int insert(int &r,int x,int f) { int temp1,temp2; if(r==0) { sale[++tot]=x; r=tot; fa[r]=f; splay(r,0); return INF; } if(x==sale[r]) return 0; else if(x<sale[r]) { temp1=sale[r]-x; temp2=insert(ch[r][0],x,r); return min(temp1,temp2); } else {temp1=x-sale[r]; temp2=insert(ch[r][1],x,r); return min(temp1,temp2); } } int main() { int n,t; scanf("%d",&n); for(int i=0;i<n;i++) { scanf("%d",&t); if(i)ans+=insert(root,t,0); else {ans=t; insert(root,t,0); } } printf("%d\n",ans); }

 

posted on 2015-12-09 17:23  hefenghhhh  阅读(263)  评论(0编辑  收藏  举报