当前位置: 首页 > news >正文

分巧克力(二分查找)

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

相关文章:

  • flutter在安卓模拟器上运行
  • ECMAScript6------数组扩展
  • 某手sig3-ios算法 Chomper黑盒调用
  • DeepSeek_部署
  • 单例模式【C++设计模式】
  • Python time模块和datatime模块的区别
  • 谷粒商城—分布式高级②.md
  • 文字识别软件cnocr学习笔记
  • AATWS: gnome下无敌的应用切换器
  • 在Ubutu18.04下搭建nfs服务器
  • 【设计模式精讲】创建型模式之工厂方法模式(简单工厂、工厂方法)
  • Windows 快速搭建C++开发环境,安装C++、CMake、QT、Visual Studio、Setup Factory
  • (网络安全)渗透测试
  • 高并发内存池项目介绍
  • [NKU]C++基础课(四)补充:继承
  • 项目管理的核心是什么?
  • XUnity.AutoTranslator-Gemini——调用Google的Gemini API, 实现Unity游戏中日文文本的自动翻译
  • 案例-22.配置文件-@ConfigurationProperties
  • 【探寻C++之旅】第五章:模板
  • 解决华硕主板的Boot界面无法设置M.2的系统启动盘问题
  • 视频丨伊朗阿巴斯港一处油罐发生高强度爆炸:造成大面积破坏,伤亡不明
  • 第三款在美获批的国产PD-1肿瘤药来了,影响多大?
  • 预热苏杯,“谁羽争锋”全国新闻界羽毛球团体邀请赛厦门开赛
  • 第四届全民阅读大会在太原举办,李书磊出席并讲话
  • 外交部:中方在黄海暂定海域建造渔业养殖设施,同中韩海域划界无关
  • “家门口的图书馆”有多好?上海静安区居民给出答案