链接:https://ac.nowcoder.com/acm/contest/11169/A
题目描述
爱德华以钢之炼金术师之名享誉全国,而今天他要完成弟弟阿尔冯斯提出的一个挑战。
已知爱德华和阿尔冯斯面前各摆了一块无限长的画布,画布上一开始均无任何颜色,且两块画布的最左端下标均设为00。阿尔冯斯将使用nn次炼金术,第ii次炼金术会使他面前画布的[0,a_{i}][0,a
i
]区间染成第ii种颜色。
在阿尔冯斯使用完nn次炼金术后,爱德华也会使用若干次炼金术,每次炼金术他可以选择[1,n][1,n]中的任意一种颜色,以及任意的一个右端点rr,将该画布的[0,r][0,r]区间染成此次选择的颜色。
规定后面的染色会覆盖前面的染色,比如先将[0,2][0,2]区间染成第22种颜色,再将[0,1][0,1]区间染成第33种颜色,则此时[0,1][0,1]区间的颜色是第3种颜色。
请问爱德华最少要使用多少次炼金术,才能把他面前的画布变成和阿尔冯斯的画布一样。
思路:
从后往前面遍历数组,如果当前的染***a[i]域大于后面染***域a[i + 1]且a[i]大于后面染***域的最大值,则cnt++,数组下标从1道n,我们从n-1开始往前面扫,cnt初始等于1,tmp(用来记住后面最大的染***域)
#include <bits/stdc++.h> using namespace std; typedef long long ll,LL; using namespace std; const int maxn = 1e6 + 7; ll n, a[maxn]; int main() { cin >> n; for(int i = 1; i <= n; i++) cin >>a[i]; ll cnt = 1, tmp = a[n]; for(int i = n - 1; i >= 1; i--) { if(a[i] > a[i + 1] && a[i] > tmp) cnt++, tmp = a[i]; } cout << cnt << endl; return 0; }