分巧克力(二分查找)

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 的值

相关推荐
FL162386312912 分钟前
[C++]使用纯opencv部署yolov12目标检测onnx模型
c++·opencv·yolo
JenKinJia19 分钟前
Windows10配置C++版本的Kafka,并进行发布和订阅测试
开发语言·c++
wen__xvn1 小时前
每日一题洛谷P1914 小书童——凯撒密码c++
数据结构·c++·算法
云中飞鸿2 小时前
MFC中CString的Format、与XML中的XML_SETTEXT格式化注意
xml·c++·mfc
BUG 劝退师2 小时前
八大经典排序算法
数据结构·算法·排序算法
m0_748240912 小时前
SpringMVC 请求参数接收
前端·javascript·算法
小林熬夜学编程2 小时前
【MySQL】第八弹---全面解析数据库表的增删改查操作:从创建到检索、排序与分页
linux·开发语言·数据库·mysql·算法
小小小白的编程日记2 小时前
List的基本功能(1)
数据结构·c++·算法·stl·list
_Itachi__2 小时前
LeetCode 热题 100 283. 移动零
数据结构·算法·leetcode
柃歌2 小时前
【UCB CS 61B SP24】Lecture 5 - Lists 3: DLLists and Arrays学习笔记
java·数据结构·笔记·学习·算法