第十五屆中北大學算法與程序設計競賽(公開賽)K.籤個到
題目描述
給定 個正整數: ,每次操作可以選擇數組中任意一個數加上或減去其下標。(即 或 )
求 次操作後,數組中最大值與最小值的差最大可能是多少。
(數組下標從1開始)
輸入描述:
第一行輸入整數 和 。
接下來一行輸入 個整數,第 個數代表 。
輸出描述:
輸出一個整數,表示執行完所有操作後最大值和最小值的差可能的最大值。
示例1
輸入
2 1
2 1
輸出
3
題目不難,只要遍歷一遍記錄變化後的最大最小值即可,有一個坑點就是 時,答案始終爲0,AC代碼如下:
#include<bits/stdc++.h>
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;
}