BZOJ P3761: Zhenhuan

这到题目网上连题解都没有

很简单,二分+贪心思想+分类讨论

当数量为偶数时只要求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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值