这到题目网上连题解都没有
很简单,二分+贪心思想+分类讨论
当数量为偶数时只要求max(r[i]+r[i+1])
当数量为奇数时,我们二分最小的后宫数并pd,为偶的后宫与第一号后宫的交集应该尽量小,而奇数的尽量多
BZOJ交不了,这很蛋疼,不过样例是过了
#include<iostream>
#include<algorithm>
using namespace std;
int mxl[20003],mxr[20003];
int m;
int r[20003];
int ll,rr;
bool check(int xx){
int x=r[1];
int y=xx-x;
mxl[1]=r[1];
mxr[1]=0;
for(int i=2;i<=m;i++){
if(i%2==1){
mxr[i]=min(y-mxr[i-1],r[i]);
mxl[i]=r[i]-mxr[i];
}else{
mxl[i]=min(x-mxl[i-1],r[i]);
mxr[i]=r[i]-mxl[i];
}
}
if(mxl[m]==0){
return true;
}else{
return false;
}
}
int erfen(int l,int r){
if(l==r){
return l;
}
int mid=(l+r)/2;
if(check(mid)==true){
return erfen(l,mid);
}else{
return erfen(mid+1,r);
}
}
int main(){
cin>>m;
for(int i=1;i<=m;i++){
cin>>r[i];
ll=max(ll,r[i]);
rr=max(rr,r[i]*3);
}
if(m==1){
cout<<r[1];
return 0;
}
int maxx;
for(int i=2;i<=m;i++){
maxx=max(r[i-1]+r[i],maxx);
}
if(m%2==0){
cout<<maxx<<endl;
}else{
int ans=erfen(ll,rr);
cout<<ans<<endl;
}
return 0;
}