题目链接:
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 }
时间: 2024-11-08 16:53:16