C++蘑菇(算法编程题解)

题目描述
齐齐在魔法世界栽种了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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值