(二分)1227. 分巧克力

简介: (二分)1227. 分巧克力

题目链接

1227. 分巧克力 - AcWing题库


一些话

跟cf上的一道铺设地板的题的手法有共通之处,

都是拿长宽/地板边长,然后相乘

切入点

为了公平起见,小明需要从这 N 块巧克力中切出 K 块巧克力分给小朋友们。

切出的巧克力需要满足:

  1. 形状是正方形,边长是整数
  2. 大小相同

边长与数量成负相关,符合二分的特征


流程

二分答案check函数伪代码(流程)

// mid长度,cnt计数,枚举巧克力,用长宽除mid再相乘得到数字加入cnt,最后再和k比较

二分边界变化

// 因为mid与cnt成反比,所以cnt>k了就缩小左边界让mid变大,cnt<k了就缩小右边界让mid变小,

// 巧克力最大就是边长最大,边长最大就是mid最大,为了让mid最大,当cnt等于k时缩小左边界就可以让mid最大

套路


ac代码

//16 : 52 ~17:07wa
// mid长度,cnt计数,枚举巧克力,用长宽除mid再相乘得到数字加入cnt,,
// 因为mid与cnt成反比,所以cnt>k了就缩小左边界让mid变大,cnt<k了就缩小右边界让mid变小,
// 巧克力最大就是边长最大,边长最大就是mid最大,为了让mid最大,当cnt等于k时缩小左边界就可以让mid最大
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
const int N = 1e5 + 10;
int n,k;
int l[N],w[N];
bool check(int mid){
    int cnt = 0;
    for(int i = 0;i < n;i++){
        cnt += (l[i] / mid) * (w[i] / mid);
    }
    if(cnt >= k) return true;
    else return false;
}
int main(){
    cin >> n >> k;
    for(int i = 0;i < n;i++){
        scanf("%d%d",&l[i],&w[i]);
    }
    int l = 1,r = 1e5;
    while(l < r){
        int mid = l + r + 1>> 1;
        if(check(mid)) l =mid ;
        else r = mid - 1;
    }
    cout << l << endl;
    return 0;
}


目录
相关文章
|
11月前
|
算法 机器人 C语言
【二分查找】分巧克力、机器人跳跃、数的范围
开始准备蓝桥杯啦!这是计划的一部分,每天都会更新一个专题的内容,内容参考自acwing蓝桥杯辅导课,有兴趣的uu们也可以自行观看
90 0
|
2月前
代码随想录Day29 贪心04 LeetCode T860 柠檬水找零 T406 根据身高重建队列 T452 用最少得箭引爆气球
代码随想录Day29 贪心04 LeetCode T860 柠檬水找零 T406 根据身高重建队列 T452 用最少得箭引爆气球
30 0
|
2月前
蓝桥备战--分糖果OJ2928 贪心 分类讨论
蓝桥备战--分糖果OJ2928 贪心 分类讨论
47 0
|
测试技术
L2-003 月饼 (25 分)(贪心)
L2-003 月饼 (25 分)(贪心)
67 0
|
人工智能 BI
L3-001 凑零钱 (30 分)
L3-001 凑零钱 (30 分)
127 0
7-57 愿天下有情人都是失散多年的兄妹 (25 分)(深搜)
7-57 愿天下有情人都是失散多年的兄妹 (25 分)(深搜)
114 0
|
算法 测试技术
7-1 月饼 (25分) —— 贪心算法
7-1 月饼 (25分) —— 贪心算法
187 0
|
机器学习/深度学习
【刷穿 LeetCode】575. 分糖果 : 分情况讨论贪心证明题
【刷穿 LeetCode】575. 分糖果 : 分情况讨论贪心证明题