题解
2026-06-16 18:34:07
发布于:山东
17阅读
0回复
0点赞
主要思路:二分,先设一个体力上限,接着看看有没有数大于这个上限....看代码吧
#include<bits/stdc++.h>
using namespace std;
int n,a[100010],r;
bool check(int x){//目前的体力上限
int b[100010]={0},cnt=0;
bool f=0;
for(int i=1;i<=n;i++){
if(a[i]>x){//大于x就是超支了所以存储
b[++cnt]=a[i];
}
}
for(int i=1;i<=cnt;i+=2){
if(b[i]!=b[i+1]){//如果不一样就是不合理的
f=1;
}
}
return !f;
}
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
r+=a[i];
}
int l=1,ans=r;
while(l<=r){
int mid=(l+r)/2;//二分模板找随机上限
if(check(mid)){
r=mid-1;
ans=mid;//记录最小答案
}
else{
l=mid+1;
}
}
cout<<ans;
return 0;
}
这里空空如也


有帮助,赞一个