【寒假每日一题】分巧克力(个人练习)详细题解+推导证明(第八天)附带转载程序员壁纸

前言

话说今天开始准备搞一个秋招的GitHub,算是复习一遍了。

今天还是寒假每日一题,不是软广,不是硬广,只是个人练习,题目来自第八届蓝桥杯省赛C++A/B组, 第八届蓝桥杯省赛JAVA A/B组。

和上次的绳子差不多,不过这一次是二维的。

【寒假每日一题】剪绳子(个人练习)详细题解+推导证明(第六天)

在这里插入图片描述

题目

儿童节那天有 K 位小朋友到小明家做客。

小明拿出了珍藏的巧克力招待小朋友们。

小明一共有 N 块巧克力,其中第 i 块是 Hi×Wi 的方格组成的长方形。

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

切出的巧克力需要满足:

形状是正方形,边长是整数
大小相同
例如一块 6×5 的巧克力可以切出 6 块 2×2 的巧克力或者 2 块 3×3 的巧克力。

当然小朋友们都希望得到的巧克力尽可能大,你能帮小明计算出最大的边长是多少么?

输入格式

  • 第一行包含两个整数 N 和 K。
  • 以下 N 行每行包含两个整数 Hi 和 Wi。
  • 输入保证每位小朋友至少能获得一块 1×1 的巧克力。

输出格式

  • 输出切出的正方形巧克力最大可能的边长。

数据范围

  • 1 ≤ N , K ≤ 105 , 1≤N,K≤105, 1N,K105,
  • 1 ≤ H i , W i ≤ 105 1≤Hi,Wi≤105 1Hi,Wi105
输入样例:
2 10
6 5
5 6
输出样例:
2

在这里插入图片描述

详细题解

写法1 O ( n l o g n ) O(nlogn) O(nlogn)

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

typedef long long LL;
const int N = 100005;

int n, m;
int h[N], w[N];

bool check(int mid)
{
    LL ans = 0;
    for (int i = 0; i < n; ++ i )
    {
        ans += (LL)(h[i] / mid) * (w[i] / mid);
        if (ans >= m) return true;
    }
    return false;
}

int main()
{
    cin >> n >> m;
    for (int i = 0; i < n; ++ i ) cin >> h[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 << r << endl;
    
    return 0;
}

毫无疑问,这是绳子的扩展题,只不过是从一维空间扩展到二维空间,从浮点数变成整型数。

最后提交,AC😁
在这里插入图片描述

推导证明

其实转换成二分法之后,这个题目就已经完成了,来画个图简单分析一下。

在这里插入图片描述
和一维空间的区别还有每个人最少是1个巧克力,所以 l = 1

计算总个数的时候,是(长 / mid)×(宽 / mid),而不是长 / mid × 宽 / mid。

举一反三

浮点数二分法

总结

继续努力,坚持更新,8th打卡。

最近看到很多人在转发这个程序员壁纸,感觉挺好看的,分享给大家。

17 张程序员壁纸推荐

1、三思后再写代码!!!
在这里插入图片描述

2、从世界上搜索喜欢你的人!!!
在这里插入图片描述
3、代码没写完,哪里有脸睡觉!!!
在这里插入图片描述
真的很不错!!!

我是管小亮 CSDN认证博客专家 TensorFlow PyTorch 图像处理
纸上得来终觉浅,绝知此事要躬行

包括但不局限于机器学习,深度学习,自然语言处理,计算机视觉,知识图谱,还有Python,C++,TensorFlow,Pytorch,Keras,PaddlePaddle等,不定时分享资源(电子书/项目/工具),学习路线,思考,面经等!!!
已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 酷酷鲨 设计师:CSDN官方博客 返回首页