题目链接:

http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1350

 

这题目因为每一个数都跟相邻的数有关,所以可以从左到右和从右到左一次扫一遍即可

 

代码:

 1 #include<iostream>
 2 #include<cstdio>
 3 #define M 100100
 4 using namespace std;
 5 
 6 int num[M],Max[M],Min[M];
 7 
 8 int max(int a,int b)
 9 {
10     return a>b?a:b;
11 }
12 int main()
13 {
14     int T,n,D;
15     long long ans;
16     cin>>T;
17     while(T--){
18         ans=0;
19         cin>>n>>D;
20         for(int i=0;i<n;i++) cin>>num[i];
21 
22         Max[0]=num[0];
23         for(int i=1;i<n;i++)
24         {
25             if(Max[i-1]-num[i]>D)
26                 Max[i]=Max[i-1]-D;
27             else Max[i]=num[i];
28         }
29 
30         Min[n-1]=num[n-1];
31         for(int i=n-2;i>=0;i--)
32         {
33             if(Min[i+1]-num[i]>D)
34                 Min[i]=Min[i+1]-D;
35             else Min[i]=num[i];
36         }
37 
38         for(int i=0;i<n;i++) ans+=(max(Min[i],Max[i])-num[i]);
39         cout<<ans<<endl;
40     }
41     return 0;
42 }

 

 posted on 2014-07-26 23:18  Love风吟  阅读(260)  评论(1编辑  收藏  举报