分巧克力(二分查找)

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+=a[i]/mid*(b[i]/mid); 如果写成cnt += a[i] * b[i] / mid;先乘法会溢出导致结果出错,所以要先分别除以mid再乘。

判断条件

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

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

相关推荐
_深海凉_12 分钟前
LeetCode热题100-寻找两个正序数组的中位数
算法·leetcode·职场和发展
故事还在继续吗19 分钟前
C++20关键特性
开发语言·c++·c++20
青少儿编程课堂1 小时前
2026青少儿信息素养大赛备赛指南!Python/Scratch/C++备考要点
开发语言·c++·python
旖-旎1 小时前
深搜练习(电话号码字母组合)(3)
c++·算法·力扣·深度优先遍历
谭欣辰1 小时前
C++快速幂完整实战讲解
算法·决策树·机器学习
Mr_pyx1 小时前
【LeetHOT100】随机链表的复制——Java多解法详解
算法·深度优先
AIFarmer2 小时前
【无标题】
开发语言·c++·算法
John_ToDebug2 小时前
WebHostView 与 TabStrip 交互机制深度解析
c++·chrome·windows
AGV算法笔记2 小时前
CVPR 2025 最新感知算法解读:GaussianLSS 如何用 Gaussian Splatting 重构 BEV 表示?
算法·重构·自动驾驶·3d视觉·感知算法·多视角视觉
勤劳的进取家3 小时前
数据链路层基础
网络·学习·算法