C. Neo's Escape
题目链接:https://codeforces.com/contest/2108/problem/C
题意:
给定一个数组
我们需要将数组元素从大到小的顺序依次遍历
不过不能改变原数组的顺序,而是通过生成不同的指针
指针可以往左或往右任意移动
求所需指针数量的最小值
思路:
容易知道如果相邻的元素相同时,遍历这些相同的元素和遍历一个相同大小的元素等价
观察到一个一般的序列,若将元素大小看作高度
其元素的连续变化趋势则是锯齿状的,也可以看作起伏的山峰状
由题意我们可以从一个山峰下降到其左右两侧的山脚
却无法从山脚上升到另一个山峰上
因此答案便是山峰的个数,也就是 山峰夹着的山脚的个数+1
只需遍历判断元素的大小关系即可
数组,很神奇吧
void solve(){
int n;cin>>n;
vector<int>a(n+1);
rep(i,1,n){
cin>>a[i];
}
vector<int>b;
b.pb(0);
for(int i=1;i<=n;i++){
if(i==1||a[i]!=a[i-1])b.pb(a[i]);
}
int cnt=0;
int m=b.size()-1;
for(int i=1;i<=m-1;i++){
if(b[i]-b[i-1]<0&&b[i]-b[i+1]<0){
cnt++;
}
}
cout<<cnt+1<<endl;
}

浙公网安备 33010602011771号