1. 程式人生 > >1588: [HNOI2002]營業額統計

1588: [HNOI2002]營業額統計

數據 http content 任務 ext next 行為 bmi node

Time Limit: 5 Sec Memory Limit: 162 MB
Submit: 19716 Solved: 8389
[Submit][Status][Discuss]

Description

營業額統計 Tiger最近被公司升任為營業部經理,他上任後接受公司交給的第一項任務便是統計並分析公司成立以來的營業情況。 Tiger拿出了公司的賬本,賬本上記錄了公司成立以來每天的營業額。分析營業情況是一項相當復雜的工作。由於節假日,大減價或者是其他情況的時候,營業額會出現一定的波動,當然一定的波動是能夠接受的,但是在某些時候營業額突變得很高或是很低,這就證明公司此時的經營狀況出現了問題。經濟管理學上定義了一種最小波動值來衡量這種情況: 該天的最小波動值 當最小波動值越大時,就說明營業情況越不穩定。 而分析整個公司的從成立到現在營業情況是否穩定,只需要把每一天的最小波動值加起來就可以了。你的任務就是編寫一個程序幫助Tiger來計算這一個值。 第一天的最小波動值為第一天的營業額。 ? 輸入輸出要求

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

Input

第一行為正整數 ,表示該公司從成立一直到現在的天數,接下來的n行每行有一個整數(有可能有負數) ,表示第i 天公司的營業額。 天數n<=32767, 每天的營業額ai <= 1,000,000。 最後結果T<=2^31

Output

輸出文件僅有一個正整數,即Sigma(每天最小的波動值) 。結果小於2^31 。

Sample Input

6
5
1
2
5
4
6

Sample Output

12

HINT

結果說明:5+|1-5|+|2-1|+|5-5|+|4-5|+|6-5|=5+4+1+0+1+1=12


沒想到排序就AC了,bzoj數據略水→_→,洛谷TLE70分

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cmath>
 4 #include<algorithm>
 5 using namespace std;
 6 
 7 const int MAXN=40000;
 8 const int INF=0x7f7f7f7f;
 9 
10 struct node
11 {
12     int num,id;
13 }a[MAXN];
14 int n,ans; 15 16 bool cmp(node A,node B) 17 { 18 return A.num!=B.num?A.num<B.num:A.id<B.id; 19 } 20 21 int check(int x) 22 { 23 int pre=INF,next=INF; 24 if(a[x].id==1) return a[x].num; 25 for(int i=x-1;i>=1;i--) 26 if(a[i].id<a[x].id) 27 { 28 pre=abs(a[i].num-a[x].num); 29 break; 30 } 31 for(int i=x+1;i<=n;i++) 32 { 33 if(a[i].id<a[x].id) 34 { 35 next=abs(a[i].num-a[x].num); 36 break; 37 } 38 } 39 return min(pre,next); 40 } 41 42 int main() 43 { 44 scanf("%d",&n); 45 for(int i=1;i<=n;i++) 46 { 47 scanf("%d",&a[i].num); 48 a[i].id=i; 49 } 50 sort(a+1,a+n+1,cmp); 51 for(int i=1;i<=n;i++) ans+=check(i); 52 printf("%d\n",ans); 53 return 0; 54 }

1588: [HNOI2002]營業額統計