(二分)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;
}


目录
相关文章
|
7月前
【Leetcode -575.分糖果 -594.最长和谐子序列】
【Leetcode -575.分糖果 -594.最长和谐子序列】
36 0
|
9月前
|
算法 机器人 C语言
【二分查找】分巧克力、机器人跳跃、数的范围
开始准备蓝桥杯啦!这是计划的一部分,每天都会更新一个专题的内容,内容参考自acwing蓝桥杯辅导课,有兴趣的uu们也可以自行观看
78 0
|
4月前
蓝桥备战--分糖果OJ2928 贪心 分类讨论
蓝桥备战--分糖果OJ2928 贪心 分类讨论
36 0
|
9月前
wustojc2013分糖果
wustojc2013分糖果
27 0
wustojc2013分糖果
|
10月前
|
测试技术
L2-003 月饼 (25 分)(贪心)
L2-003 月饼 (25 分)(贪心)
61 0
|
11月前
Leecode1103 分糖果
Leecode1103 分糖果
45 0
|
11月前
蓝桥杯:二分法求分巧克力
蓝桥杯:二分法求分巧克力
46 0
|
C++
分糖果(C++)
Alice 非常喜欢这些糖,她想要在遵循医生建议的情况下,尽可能吃到最多不同种类的糖。Alice 注意到她的体重正在增长,所以前去拜访了一位医生。医生建议 Alice 要少摄入糖分,只吃掉她所有糖的。枚糖的情况下,可以吃到糖的 最多 种类数。,返回: Alice 在仅吃掉。给你一个长度为 n 的整数数组。
93 0
092.分糖果
092.分糖果 #include<stdio.h> void print(int s[]); int judge(int c[]); int j=0; void main() { static int sweet[10]={10,2,8,22,16,4,10,6,14,20}; /*初始化数组数据*/ int i,t[10],l; clrscr(); printf(" Child No. 1 2 3 4 5 6 7 8 9 10\n"); printf("--------------------------
47 0
7-4 吃货的最短路径 (10 分)
7-4 吃货的最短路径 (10 分)
60 0