CSU1350 To Add which?

题目链接:

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 }

 

你可能感兴趣的:(add)