刷题记录:牛客NC19812Mountain

传送门:牛客

题目描述:

平面上有n座山,每座山都有左右两面,第i座山的高度为ai,现在弱弱在第一座山的左边山脚下(高度为
0),他想要依此爬过这些山,到达第n座山的右边山脚下。
除了简单的爬上爬下,还有一种特殊操作。
如果弱弱目前在第i座山右面的海拔x的位置,且第j ( i < j )座山的海拔大于等于x,且第i+1,\ldots,j-
1i+1,…,j−1座山中没有一座山的海拔高于x,那么他可以使用绳索滑到第j座山左面海拔x的位置。
弱弱想找到一种方式,使得他在行程中海拔变化的幅度最小。请输出最小幅度。

题目描述比较奇怪,一开始读我并没有读懂题目要表达的意思,首先我以为是一道递增子序列之类的题目,有点导弹拦截的意味,再仔细读读又感觉有点点的不对,再发现这道题就是来搞笑的一道题,不知道为什么会有这种题目的存在??

题目要求的就是让我们求出最高海拔的值再乘一个二即可,因为照题目的意思,最高海拔显然我们是一定会经过的,既然这样的话我们所变化的幅度肯定是以最高海拔为主的,又是变化幅度包含增加与减少,因此乘2即可

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;
typedef long long ll;
#define inf 0x3f3f3f3f
#define root 1,n,1
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
inline ll read() {
	ll x=0,w=1;char ch=getchar();
	for(;ch>'9'||ch<'0';ch=getchar()) if(ch=='-') w=-1;
	for(;ch>='0'&&ch<='9';ch=getchar()) x=x*10+ch-'0';
	return x*w;
}
#define maxn 1000000
int a[2000];
int main() {
	int n;n=read();
	int maxx=-999;
	for(int i=1;i<=n;i++) {
		a[i]=read();maxx=max(a[i],maxx);
	}
	cout<<maxx*2<<endl;
	return 0;
}

你可能感兴趣的:(c++算法,算法,c++)