#include<iostream>
using namespace std;
int a,b,c,d;
bool che(int mid){
for(int i=0;i<=a;i++){//枚举左上耗电量
for(int j=0;j<=d;j++){//枚举右上耗电量
int n=max(a-i-j/4,d-j-i/4);//a,d还需要多少
if((mid-i-j)/2<n) continue;
int now=mid-i-j;//还有多少可以分配
int bn=max(0,b-i/2-j/2);// b还需要多少
int cn=max(0,c-i/2-j/2);// c还需要多少
int bb=max(0,(bn-now/4)*4/3);// 估算b大概区间
//b+c/4=bn,b+c=now
//b+c/4=bn -> 4b+c=4bn
//4b+c=4bn -> 3b+now=4bn
//p=(4bn-now)/3
for(int k=max(0,bb-5);k<=min(now,bb+5);k++){// 枚举b在 这个近似值附近再枚举
if(k+(now-k)/4>=bn&&k/4+now-k>=cn){//左下提供 +b>=b 左下>=c需要
return 1;
}
}
}
}
return 0;
}
int main(){
cin>>a>>b>>c>>d;
int l=0,r=a+b+c+d,ans=a+b+c+d;
while(l<=r){//枚举最小耗电量之和
int mid=(l+r)/2;
if(che(mid)){
ans=mid;
r=mid-1;
}else l=mid+1;
}
cout<<ans;
return 0;
}
给大家看一下路灯照明代码
于 2023-10-01 19:14:23 首次发布