两种方法:
(第二种也就是没注释的借鉴了题解中大佬的代码,用的vector容器中back()和pop_back())
方法一:
直接用数组模拟:数组大小开到n+1从1开始,最后一个存啾啾的可爱值。双指针l和r循环,r代表的是啾啾当前所在的位置,每次去找往r前面比啾啾可爱值更大的将其替换为啾啾,如果r<l说明越界了没找到,那就用暂存的cur_r重新赋给r。也就是啾啾不动,然后直接从当前位置到啾啾位置r-l+1就是区间长度直接结束循环,因为没有比啾啾大的了,没必要继续否则超时,如果替换成功会l++和cnt++,进入下次循环。最后输出cnt。
方法二:
直接预处理,存完元素就遍历找比啾啾大的元素下标,并存在一个vector数组b中。接着l=1,r=n+1,这里到n+1是为处理特殊情况也就是b为空,那么到末尾有n+1次因为啾啾也要等一分钟。最后每次判断b是否为空和末尾元素是否大于l,如果是就r=末尾,末尾pop,l和cnt递增。输出cnt即可。
#include<bits/stdc++.h>
using namespace std;
#define int long long
void solve(){
int n;
cin>>n;
// vector<int>a(n+2);
// for(int i=1;i<=n;i++){
// cin>>a[i];
// }
// cin>>a[n+1];
// int l=1,r=n+1;
// int cnt=0;
// while(l<=r){
// int cur_r=r;
// while(a[r]<=a[cur_r]&&l<=r){
// r--;
// }
// if(l<=r){
// a[r]=a[cur_r];
// }else{
// r=cur_r;
// cnt+=r-l+1;
// break;
// }
// l++;
// cnt++;
// }
// cout<<cnt<<endl;
vector<int>a(n+1);
int jiujiu;
vector<int>b;//存储比jiujiu更可爱的位置
for(int i=1;i<=n;i++){
cin>>a[i];
}
cin>>jiujiu;
for(int i=1;i<=n;i++){
if(a[i]>jiujiu){
b.push_back(i);
}
}
int l=1,r=n+1,cnt=0;
while(l<=r){
if(!b.empty()&&b.back()>=l){
r=b.back();
b.pop_back();
}
l++,cnt++;
}
cout<<cnt;
}
signed main(){
ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
solve();
return 0;
}

京公网安备 11010502036488号