题解
2026-03-18 21:24:20
发布于:广东
0阅读
0回复
0点赞
二分查找最小的移动代价:
如果当前元素小于当前最小移动代价(x),那么就可以移动。这就说明了所有≤x的数都可以随意移动,那么一定可以满足题意。
现在考虑>x。>x的数不可移动,所以判断所有>x在原本序列中是否满足题意。
#include<bits/stdc++.h>
using namespace std;
using ll=long long;
const ll N=1e5+5;
ll n,a[N];
bool check(int x){
int now=0;
for(ll i=1;i<=n;i++){
if(a[i]>x){
if(now==0){
now=a[i];
}else if(now==a[i]){
now=0;
}else return false;
}
}
return true;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
ll nmax=0;
cin>>n;
for(ll i=1;i<=n;i++){
cin>>a[i];
nmax=max(nmax,a[i]);
}
ll l=1,r=nmax,mid;
while(l<=r){
mid=(l+r)/2;
if(check(mid)) r=mid-1;
else l=mid+1;
}
cout<<++r;
return 0;
}
这里空空如也




有帮助,赞一个