news 2026/9/15 10:49:31

2. 分巧克力-二分答案

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
2. 分巧克力-二分答案

题目:



2.分巧克力 - 蓝桥云课 (lanqiao.cn)

二分必须得是有序的

二分是不断把有序的查找区间缩小为原来的一半,直到找到目标元素或确定目标元素不存在

思路:

本题是二分答案经典题:直接求最大边长很难;反过来,给定边长mid,判断能不能切出至少 K 块,这个判断函数check很好写。二分枚举边长,找满足条件的最大边长。

是最大化答案!!!

边长越大,能切出来的巧克力块数越少,具有单调性,所以可以二分答案。

  • 如果mid边长可以分出≥k 块:说明答案≥mid,继续往更大的尝试
  • 如果mid不够 k 块:说明答案一定 < mid,只能往更小尝试

最新的题解,复习这个:

#include <bits/stdc++.h> #define int long long //避免数据范围溢出 #define endl '\n' using namespace std; int n,k; // st[i][0]是第i块巧克力高度H,st[i][1]宽度W int st[100005][2];//多五个是为了空出来l和r初始的位置,至少要比10^5多俩位置 // check函数:给定正方形边长mid,能否切出 >=k 块正方形巧克力 bool check(int mid){ int cnt=0; for(int i=0;i<n;i++){ // 这块巧克力,沿着高能切 H/mid 个,宽能切 W/mid 个,相乘就是总数 cnt+=(st[i][0]/mid)*(st[i][1]/mid); } return cnt>=k; } void solve(){ cin>>n>>k; for(int i=0;i<n;i++){ cin>>st[i][0]>>st[i][1]; } // 二分边界:最小边长l=0,最大可能边长r=1e5(题目H,W最大1e5) int l=0,r=100000;//!!!r我一开始写成n+1了,不对,应该写最大的可能的边长 // 二分模板:l+1<r ,左闭右开找最大满足条件的值 while(l+1<r){ int mid=l+r>>1;//等价 mid=(l+r)/2,位运算更快 //左边是可行区间,即l始终走在可行区间里面 if(check(mid)) l=mid;// mid可行,尝试更大的边长,把左边界移到mid else r=mid; } cout<<l; } signed main(){ //关流,输入输出速度变快 ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); solve(); return 0; }

曾经的题解,但是我觉得写的不好,应该看最新的:

#include <bits/stdc++.h> #define int long long #define endl '\n' using namespace std; int n,k,st[100005][2]; //判断边长为mid(a)的正方形巧克力能不能把所有巧克力分成>=k份 //因为小朋友一共k人,分成的巧克力边长必须是>=k的最大可能边长 bool check(int a){ int cnt=0;//当前边长分成多少块巧克力了 for(int i=0;i<n;i++){ cnt+=(st[i][0]/a)*(st[i][1]/a); } return cnt>=k; } void solve(){ int l=0,r=0;//二分的起始和结束 cin>>n>>k; for(int i=0;i<n;i++){ cin>>st[i][0]>>st[i][1]; r=max(max(r,st[i][0]),st[i][1]); } while(l<r){ // >>1等同于除以2,只不过更快一些 int mid=(l+r+1)>>1;//这里加一是因为下面r=mid-1减一了 if(check(mid)){ l=mid; } else{ r=mid-1;//因为这里是mid-1,所以上边是mid=(l+r+1)>>1,里面得加个1 } } cout<<l; } signed main(){ ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); solve(); return 0; }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/15 10:46:41

Vue+ECharts数据可视化系统实战:从图表封装到大屏部署

简介&#xff1a;一份面向毕业设计或前端初学者的数据可视化系统项目包&#xff0c;围绕Vue与ECharts实现图表展示和大屏监控场景。内容不限于静态图表&#xff0c;还结合前后端分离思想&#xff0c;通过指定数据即可快速渲染视觉效果&#xff0c;适合完成可视化类毕设或搭建业…

作者头像 李华
网站建设 2026/9/15 10:44:01

多主体能源系统博弈优化:主从博弈与Matlab实现

1. 项目概述&#xff1a;多主体综合能源系统的博弈优化电力系统正在经历一场深刻的变革。随着可再生能源占比提升和用能需求多样化&#xff0c;传统的集中式调度模式已难以满足灵活性需求。我在参与某工业园区微电网项目时&#xff0c;深刻体会到多主体协同优化的必要性——光伏…

作者头像 李华
网站建设 2026/9/15 10:43:13

SmartDNS 并行解析 DNS 并返回最快 IP:家庭与小型团队的落地笔记

SmartDNS 并行解析 DNS 并返回最快 IP&#xff1a;家庭与小型团队的落地笔记 【免费下载链接】smartdns A local DNS server to obtain the fastest website IP for the best Internet experience, support DoT, DoH, DoQ. 一个本地DNS服务器&#xff0c;获取最快的网站IP&…

作者头像 李华
网站建设 2026/9/15 10:41:55

phpStudy部署ThinkPHP3.2 CRM实战指南

1. 项目概述&#xff1a;为什么用 phpStudy 部署符号象CRM 是当前中小团队最务实的选择你手头有一套基于 ThinkPHP 框架开发的“符号象CRM”客户关系管理系统&#xff0c;可能是从开源社区下载的、公司内部定制的&#xff0c;也可能是采购的轻量版商业授权版本。现在你要把它跑…

作者头像 李华