第十五届中北大学算法与程序设计竞赛(公开赛)K.签个到

第十五届中北大学算法与程序设计竞赛(公开赛)K.签个到

题目链接

题目描述

给定   n \ n  n 个正整数: a 1 , a 2 . . . a n − 1 , a n a_1,a_2...a_{n-1},a_n a1,a2...an1,an ,每次操作可以选择数组中任意一个数加上或减去其下标。(即 a i = a i + i a_i=a_i+i ai=ai+i a i = a i − i a_i=a_i-i ai=aii )
  m \ m  m 次操作后,数组中最大值与最小值的差最大可能是多少。
(数组下标从1开始)

输入描述:

第一行输入整数   n \ n  n   m \ m  m ( 1 < = n < = 100000 , 0 < = m < = 100000 ) (1<=n<=100000,0<=m<=100000) (1<=n<=100000,0<=m<=100000)
接下来一行输入   n \ n  n 个整数,第   i \ i  i 个数代表 a i a_i ai ( − 100000 < = a i < = 100000 ) (-100000<=a_i<=100000) (100000<=ai<=100000)

输出描述:

输出一个整数,表示执行完所有操作后最大值和最小值的差可能的最大值。

示例1

输入

2 1
2 1

输出

3

题目不难,只要遍历一遍记录变化后的最大最小值即可,有一个坑点就是 n = 1 n=1 n=1 时,答案始终为0,AC代码如下:

#include
using namespace std;
typedef long long ll;
 
main(){
     
    ll n,m;
    cin>>n>>m;
    ll a[n+1];
    ll mn=1e18,mx=-1e18,MN=1e18,MX=-1e18;
    for(ll i=1;i<=n;i++){
     
        cin>>a[i];
        mn=min(mn,a[i]-m*i);
        mx=max(mx,a[i]+m*i);
        MN=min(MN,a[i]);
        MX=max(MX,a[i]);
    }
    if(n==1) {
     puts("0");exit(0);}
    cout<<max(mx-MN,MX-mn)<<endl;
}

你可能感兴趣的:(思维,牛客)