(二分)1227. 分巧克力

目录

题目链接

一些话

        切入点 

流程

套路

ac代码


题目链接

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;
}


我草,又~在~水~字~数~啦!我草,又~在~水~字~数~啦!我草,又~在~水~字~数~啦!我草,又~在~水~字~数~啦!我草,又~在~水~字~数~啦!我草,又~在~水~字~数~啦!我草,又~在~水~字~数~啦!我草,又~在~水~字~数~啦!我草,又~在~水~字~数~啦!我草,又~在~水~字~数~啦!我草,又~在~水~字~数~啦!我草,又~在~水~字~数~啦!我草,又~在~水~字~数~啦!我草,又~在~水~字~数~啦!我草,又~在~水~字~数~啦!我草,又~在~水~字~数~啦!我草,又~在~水~字~数~啦!我草,又~在~水~字~数~啦!我草,又~在~水~字~数~啦!我草,又~在~水~字~数~啦!~啦!我草,又~在~水~字~数~啦!我草,又~在~水~字~数~啦!我草,又~在~水~字~数~啦!我草,又~在~水~字~数~啦!我草,又~在~水~字~数~啦!我草,又~在~水~字~数~啦!我草,又~在~水~字~数~啦!我草,又~在~水~字~数~啦!我草,又~在~水~字~数~啦!我草,又~在~水~字~数~啦!我草,又~在~水~字~数~啦!我草,又~在~水~字~数~啦!我草,又~在~水~字~数~啦!我草,又~在~水~~啦!我草,又~在~水~字~数~啦!我草,又~在~水~字~数~啦!我草,又~在~水~字~数~啦!我草,又~在~水~字~数~啦!我草,又~在~水~字~数~啦!我草,又~在~水~字~数~啦!我草,又~在~水~字~数~啦!我草,又~在~水~字~数~啦!我草,又~在~水~字~数~啦!我草,又~在~水~字~数~啦!我草,又~在~水~字~数~啦!我草,又~在~水~字~数~啦!我草,又~在~水~字~数~啦!我草,又~在~水~~啦!我草,又~在~水~字~数~啦!我草,又~在~水~字~数~啦!我草,又~在~水~字~数~啦!我草,又~在~水~字~数~啦!我草,又~在~水~字~数~啦!我草,又~在~水~字~数~啦!我草,又~在~水~字~数~啦!我草,又~在~水~字~数~啦!我草,又~在~水~字~数~啦!我草,又~在~水~字~数~啦!我草,又~在~水~字~数~啦!我草,又~在~水~字~数~啦!我草,又~在~水~字~数~啦!我草,又~在~水~~啦!我草,又~在~水~字~数~啦!我草,又~在~水~字~数~啦!我草,又~在~水~字~数~啦!我草,又~在~水~字~数~啦!我草,又~在~水~字~数~啦!我草,又~在~水~字~数~啦!我草,又~在~水~字~数~啦!我草,又~在~水~字~数~啦!我草,又~在~~数~啦!我草,又~在~水~字~数~啦!我草,

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Python中,对商品按功能分类可以使用字典数据结构来实现。具体实现方法如下: 1. 首先创建一个字典,用于存储商品分类信息,例如: ``` goods_dict = { '家电': [], '数码产品': [], '家居用品': [], '食品饮料': [], '服装鞋帽': [], '美容护肤': [] } ``` 2. 接着读取商品数据,将每个商品根据其功能分类加入到对应的分类列表中,例如: ``` # 假设商品数据存储在一个二维列表中,每个元素包括商品名称和功能分类 goods_data = [ ['电视机', '家电'], ['洗衣机', '家电'], ['手机', '数码产品'], ['平板电脑', '数码产品'], ['床上用品', '家居用品'], ['餐具', '家居用品'], ['牛奶', '食品饮料'], ['巧克力', '食品饮料'], ['外套', '服装鞋帽'], ['运动鞋', '服装鞋帽'], ['面霜', '美容护肤'], ['洗面奶', '美容护肤'] ] # 根据功能分类将商品加入到对应的列表中 for goods in goods_data: goods_name = goods[0] goods_category = goods[1] if goods_category in goods_dict: goods_dict[goods_category].append(goods_name) ``` 3. 最后,可以输出每个分类下的商品列表,例如: ``` for category, goods_list in goods_dict.items(): print(category) print('-' * 20) for goods in goods_list: print(goods) print() ``` 输出结果如下: ``` 家电 -------------------- 电视机 洗衣机 数码产品 -------------------- 手机 平板电脑 家居用品 -------------------- 床上用品 餐具 食品饮料 -------------------- 牛奶 巧克力 服装鞋帽 -------------------- 外套 运动鞋 美容护肤 -------------------- 面霜 洗面奶 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值