五级第一题题解代码
2026-01-11 19:00:19
发布于:广东
//什么时候二分?
//对于任意有序的情况都可以进行二分
//问题转化,对于所有的小于x的值都可以进行无限的移动操作
//无线的移动操作等价于删除-->最终目的使得所有未能移动的位置相邻
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10;
#define ll long long
bool check(vector<int>v,int mid){
vector<int>tmp;
for(auto cur:v){
//删除所有小于等于答案的点
if(cur<=mid)continue;
//保留大于答案的点
tmp.push_back(cur);
}
//迭代删除,其中的相邻重复元素(tmp中存放的都是大于答案的点)
while(tmp.size()){
if(tmp.back()==tmp[tmp.size()-2]){
tmp.pop_back();
tmp.pop_back();
}else{
break;
}
}
return !tmp.size();
}
void solve(){
vector<int>v;
int n;
cin>>n;
for(int i=1;i<=n;i++){
int x;
cin>>x;
v.push_back(x);
}
int l=1,r=n;
while(l<=r){
int mid=(l+r)>>1;
if(check(v,mid)){
r=mid-1;
}else{
l=mid+1;
}
}
cout<<l<<endl;
}
int main(){
int t=1;
// cin>>t;
while(t--){
solve();
}
}
这里空空如也













有帮助,赞一个