给定 $n$ 根木头,第 $i$ 根长度为 $a[i]$。要切成不少于 $m$ 段等长木段,求最大可能长度,则横线上应填写( )。
const int MAXN = 100005;
long long a[MAXN];
int n, m;
bool check(long long x){
long long cnt = 0;
for(int i = 1; i <= n; i++){
if(x == 0) return true;
cnt += a[i] / x;
if(cnt >= m) return true;
}
return false;
}
int main(){
cin >> n >> m;
long long mx = 0;
for(int i = 1; i <= n; i++){
cin >> a[i];
mx = max(mx, a[i]);
}
long long l = 1, r = mx;
long long ans = 0;
while(l <= r){
long long mid = l + (r - l) / 2;
if(check(mid)){
ans = mid;
________
}else{
________
}
}
cout << ans << endl;
return 0;
}逻辑代数运算:与(∧/×)、或(∨/+)、非(┐/¬)。德摩根律:┐(A∧B)=┐A∨┐B,┐(A∨B)=┐A∧┐B。
注意德摩根律的正确应用:┐(A∧B)=┐A∨┐B,┐(A∨B)=┐A∧┐B。C++中逻辑运算符有短路求值特性。
【考点】二分答案|贪心策略|边界处理
GESP 五级《算法与程序设计》模块,考查二分查找在"答案空间单调性"问题上的应用。命题人卡住的是:考生看到求最大值就条件反射用贪心,却忘了这道题最优解一定在可行解集合的边界——必须用二分去"逼近"那个临界值。