AcWing 1227. 分巧克力(代码+思路)——二分
原题链接
简单
//本道题是一道较为简单的二分题,对需要求的结果(分出的巧克力的边长a)进行二分,
//列出有关Hi、Wi、k和a之间的关系方程作为二分的判断条件:
//<i从1到n求和>[(Hi/a)<下取整> * (Wi/a)<下取整>] = 可以分出的巧克力块数k0,然后将k0与k进行比较
//二分常规的做题顺序,基本上是:
//1.先决定要二分的量(通常是题目中要求求解的结果),并考虑二分成的两部分区间有什么含义
//2.找出二分的判断条件,即怎么才能将要二分的量二分成两个部分
//3.但有的时候,题目会很简单,简单到你把各个变量之间的关系公式列出来就能发现该题目是可以二分的,比如1227.分巧克力,4956.冶炼金属
#include<iostream>
#include<algorithm>
using namespace std;
int n, k;
const int N = 1e5 + 10;
int h[N], w[N];
int l = 1, r = 1e5;
int main()
{
cin >> n >> k;
for(int i = 1; i <= n; i ++)
{
cin >> h[i] >> w[i];
//下面两行加上之后就是错的,切出的巧克力的边长并不是一定小于原有的 N块巧克力中边长的最小值的,
//因为当原有的巧克力中,有巧克力妨碍我们切出最大边长的巧克力,那么这种巧克力可以直接扔掉!
//int minu = min(h[i], w[i]);
//r = min(minu, r);
}
while(l < r)
{
int cnt = 0;
int mid = l + r + 1 >> 1;
for(int i = 1; i <= n; i ++)
{
cnt += (h[i] / mid) * (w[i] / mid);
}
if(cnt < k) r = mid - 1;
else l = mid;
}
cout << l << endl;
return 0;
}
以下也是一些较为简单的二分题的题解:
https://www.acwing.com/solution/content/231354/
https://www.acwing.com/solution/content/231954/