分巧克力(二分查找)

cpp 复制代码
#include <iostream>
using namespace std;
int main()
{
  // 请在此输入您的代码
  int n,k;
  cin>>n>>k;
  int N=100005;
  int a[N],b[N];
  for(int i=0;i<n;i++){
    cin>>a[i]>>b[i];
  }
  int l=1,r=1e5;
  int ans;
  while(l<=r){
    int mid=l+(r-l)/2;
    long long cnt=0;
    for(int i=0;i<n;i++){
      cnt+=a[i]/mid*(b[i]/mid);
    }
    if(cnt>=k){
      ans=mid;
      l=mid+1;
    } else{
      r=mid-1;
    }
  }
  cout<<ans;
  return 0;
}

二分查找的核心在于找到**单调性,**具体来说:

  • 如果某个边长 mid 可以切割出至少 K 块巧克力 ,那么 任何比 mid 小的边长都能切割出更多(或者至少同样多)块巧克力。
  • 如果某个边长 mid 无法切割出至少 K 块巧克力 ,那么 任何比 mid 大的边长也无法满足条件。

这意味着我们可以使用 二分查找 来找到最大可行的边长。

cnt :计算当前 mid 下每块巧克力可以切割出的块数

注意cnt+=ai/mid*(bi/mid); 如果写成cnt += ai * bi / mid;先乘法会溢出导致结果出错,所以要先分别除以mid再乘。

判断条件

如果 cnt >= k,说明当前 mid 可以切割出足够多的巧克力块。此时,可以尝试增大 mid,因此调整 l = mid + 1,并将 ans = mid 记录下来。

如果 cnt < k,说明 mid 太大,无法切割出足够的块数,因此将 r = mid - 1,减少 mid 的值

相关推荐
晴天的雨.9922 分钟前
[C++算法]快乐数
数据结构·c++·算法
孤狼warrior6 分钟前
SCTR 五次失败的安全 BN 路由器
人工智能·python·深度学习·算法·安全·yolo
影视飓风TIM8 分钟前
C++11 核心新特性完整梳理
数据结构·c++·算法
艾莉丝努力练剑9 分钟前
【AI大模型接入SDK】Ollama本地大语言模型部署
c++·人工智能·语言模型·自然语言处理·面试
晴天的雨.9929 分钟前
[C++]算法双指针 复写0
数据结构·c++·算法
橘子汽水16824 分钟前
Leetcode 128,49最长连续序列,字母异位词分组
java·算法·leetcode
mmmmath_326 分钟前
LeetCode.438.找到字符串中所有字母异位词
数据结构·算法·leetcode
Nil20831 分钟前
leetcode 22括号生成
算法·leetcode·深度优先
Navigator_Z35 分钟前
LeetCode //C - 1237. Find Positive Integer Solution for a Given Equation
c语言·算法·leetcode