炼金术师
题目链接:nowcoder 217127
到牛客看:
题目大意
给你一些操作,每次将 1~x 的地方染上一个新的颜色。
你可以任意选一个颜色,选一个 x 把 1~x 的地方都染上这个颜色。
问你你至少要染多少次才能染的跟题目的一样。
思路
根据题目容易看出它就是要你维护一个单调队列,然后问你到最后它的长度。
然后你就跟着做就好了。
代码
#include<cstdio>
using namespace std;
int n, x, q[1000001];
int main() {
scanf("%d", &n);
for (int i = 1; i <= n; i++) {
scanf("%d", &x);
while (q[0] && q[q[0]] <= x) q[0]--;
q[++q[0]] = x;//维护单调队列
}
printf("%d", q[0]);//输出最后单调队列的长度
return 0;
}