题目描述
齐齐在魔法世界栽种了N个蘑菇,这些蘑菇沿着一条线排成一排,第i个蘑菇的高度为Ai。
齐齐不喜欢蘑菇按自己的习性乱长,他喜欢蘑菇长得整整齐齐的样子。具体来说,就是相邻的两个蘑菇,长在右边的最好不要比长在左边的矮。
齐齐可以向魔法长老借一种药水(且只能借用一种),药水能改变所有蘑菇的高度。对于第i个蘑菇,魔力值为X(X≥0)的药水会将其高度变成 |Ai-X|。
齐齐想知道,要想让自己的蘑菇如上面所述那样长得”整整齐齐“的,需要借用的药水魔力值X最小是多少?如果没有任何一种魔力值的药水能达到目标,请输出-1。
输入
第一行一个整数N;
第二行N个整数,表示N个蘑菇依次的高度Ai。
输出
输出一个整数,表示答案。
样例
输入
样例一:
5
5 3 3 3 5
样例二:
4
5 3 4 5
样例三:
6
29613295 52036613 75100585 78027446 81409090 73215
输出
样例一:
4
样例二:
-1
样例三:
40741153
提示
数据范围:
对于30%的数据,1≤N,Ai≤100;
对于50%的数据,1≤N,Ai≤10000;
对于100%的数据,1≤N≤200000,1≤Ai≤100000000;
参考代码
//找到相邻两个数顺序出错的位置,借用数轴进行分析,利用数学的关系不等式,得出必须大于等于两项的中间值
#include<bits/stdc++.h>
using namespace std;
int N;
int a[200005];
int t;
int main(){
cin >> N;
for(int i=1;i<=N;i++){
cin >> a[i];
}
for(int i=1;i<N;i++){
if(a[i]>a[i+1]){ //找到最大值
t=max(t, (a[i]+a[i+1]+1)/2); //这里加1是为了解决不能被2整除的情况
}
}
//将t带入进行模拟遍历,判断是否可行
for(int i=1;i<N;i++){
if(abs(a[i]-t)>abs(a[i+1]-t)){
cout << -1;
return 0;
}
}
cout << t;
return 0;
}