分巧克力(二分法,且注意避免边界问题)
儿童节那天有K位小朋友到小明家做客。小明拿出了珍藏的巧克力招待小朋友们。
小明一共有N块巧克力,其中第i块是Hi x Wi的方格组成的长方形。
为了公平起见,小明需要从这 N 块巧克力中切出K块巧克力分给小朋友们。切出的巧克力需要满足:1. 形状是正方形,边长是整数
2. 大小相同例如一块6x5的巧克力可以切出6块2x2的巧克力或者2块3x3的巧克力。
当然小朋友们都希望得到的巧克力尽可能大,你能帮小Hi计算出最大的边长是多少么?
输入格式
第一行包含两个整数N和K。(1 <= N, K <= 100000)
以下N行每行包含两个整数Hi和Wi。(1 <= Hi, Wi <= 100000)
输入保证每位小朋友至少能获得一块1x1的巧克力。输出格式
输出切出的正方形巧克力最大可能的边长。
样例输入
2 10
6 5
5 6样例输出
2
直接使用暴力法,复杂度为O(n*N),会超时
#include<bits/stdc++.h>
using namespace std;const int n = 1e5 + 10;
struct cho {int height;int weidth;
} cc[n];//返回可以将m*n的巧克力分成多少块size*size的巧克力的数量
int cut(int m, int n, int size) { return (m / size) * (n / size);
}int main() {int N, K; cin >> N >> K;for (int i = 1; i <= N; i++) { cin >> cc[i].height >> cc[i].weidth;}int max_size = 1, count;for (int i = 1; i <= n; i++) { //暴力,从1*1开始尝试起 复杂度为O(n*N) count = 0;for (int j = 1; j <= N; j++) { //将所有巧克力的块数加起来 count += cut(cc[j].height, cc[j].weidth, i);}if (count >= K) {max_size = max(max_size, i);} else {break; //外层for循环 } }cout << max_size;return 0;
}
下面使用二分法对边长进行搜索,从而达到加速的目的
在使用二分法时,需要注意循环条件为left < right ,且 middle = (left + right + 1) >> 1 ,这样可以避免死循环。但这不是死的,区间跳转条件 l = mid 决定了 mid = (l + r + 1) / 2。
#include<bits/stdc++.h>
using namespace std;const int n = 1e5 + 10;
struct cho {int height;int weidth;
} cc[n];//返回可以将m*n的巧克力分成多少块size*size的巧克力的数量
int cut(int m, int n, int size) { return (m / size) * (n / size);
}int main() {int N, K; cin >> N >> K;for (int i = 1; i <= N; i++) { cin >> cc[i].height >> cc[i].weidth;}int count;int left = 1, right = 1e5, middle; while (left < right) { //二分法// +1 防止死循环 middle = (left + right + 1) / 2;count = 0;// cout << 55 << endl; 测试死循环用 for (int j = 1; j <= N; j++) { //将所有巧克力的块数加起来 count += cut(cc[j].height, cc[j].weidth, middle);}if (count >= K) {left = middle;// cout << 11 << endl; 测试死循环用 } else if (count < K) {right = middle - 1;// cout << 22 << endl; 测试死循环用}}// 当while循环退出时,left必定等于right,因为是闭区间,所以最终结果就是leftcout << left;return 0;
}
觉得有用就点个赞吧~
分巧克力(二分法,且注意避免边界问题)相关推荐
- C++实现 1227. 分巧克力
C++实现 1227. 分巧克力 大家好,我叫亓官劼(qí guān jié ),在CSDN中记录学习的点滴历程,时光荏苒,未来可期,加油~博主目前仅在CSDN中写博客,唯一博客更新的地址为:亓官 ...
- 蓝桥杯 2017试题I 分巧克力(二分求解)
/*儿童节那天有K位小朋友到小明家做客.小明拿出了珍藏的巧克力招待小朋友们. 小明一共有N块巧克力,其中第i块是Hi x Wi的方格组成的长方形. 为了公平起见,小明需要从这 N 块巧克力中切出K块巧 ...
- 蓝桥杯第八届省赛JAVA真题----分巧克力
标题: 分巧克力 儿童节那天有K位小朋友到小明家做客.小明拿出了珍藏的巧克力招待小朋友们. 小明一共有N块巧克力,其中第i块是Hi x Wi的方格组成的长方形. 为了公平起见,小明需要从这 N 块巧克 ...
- 题目 1885: 2017 分巧克力
蓝桥杯2017年第八届真题-分巧克力 - C语言网 做题记录: 第一次(16分钟/78')超时: 通过举例,可以直到长宽 a*b的巧克力,分边长为i的巧克力可以分(a/i)*(b/i)块 思路:ma ...
- 蓝桥杯 分巧克力 python
蓝桥杯 分巧克力 python 题目标题 儿童节那天有K位小朋友到小明家做客.小明拿出了珍藏的巧克力招待小朋友们. 小明一共有N块巧克力,其中第i块是Hi x Wi的方格组成的长方形. 为了公平起见, ...
- 蓝桥杯java第八届第九题--分巧克力
标题: 分巧克力儿童节那天有K位小朋友到小明家做客.小明拿出了珍藏的巧克力招待小朋友们.小明一共有N块巧克力,其中第i块是Hi x Wi的方格组成的长方形.为了公平起见,小明需要从这 N 块巧克力中切 ...
- 2017蓝桥杯省赛---java---B---9(分巧克力)
题目描述 标题: 分巧克力儿童节那天有K位小朋友到小明家做客.小明拿出了珍藏的巧克力招待小朋友们.小明一共有N块巧克力,其中第i块是Hi x Wi的方格组成的长方形.为了公平起见,小明需要从这 N 块 ...
- 2017蓝桥杯c语言C组承压计算,蓝桥杯2017Java B组---分巧克力and承压计算
分巧克力 package lala; /* *儿童节那天有K位小朋友到小明家做客.小明拿出了珍藏的巧克力招待小朋友们. 小明一共有N块巧克力,其中第i块是Hi x Wi的方格组成的长方形. 为了公平起 ...
- 【每日一题2019-11-14】-蓝桥杯 prev37 分巧克力
[每日一题2019-11-14]-蓝桥杯 prev37 分巧克力 文章目录 [每日一题2019-11-14]-蓝桥杯 prev37 分巧克力 1.问题描述 2.输入格式 3.样例输入 4.样例输出 5 ...
- Java实现第八届蓝桥杯分巧克力
分巧克力 题目描述 儿童节那天有K位小朋友到小明家做客.小明拿出了珍藏的巧克力招待小朋友们. 小明一共有N块巧克力,其中第i块是Hi x Wi的方格组成的长方形. 为了公平起见,小明需要从这 N 块巧 ...
最新文章
- 华为充电器接口叫什么_插座USB接口跟手机充电器有什么不同_电工百科
- MySQL数据库开发理念_mysql之数据库基本理念
- 数据流通与交易国家实验室成立 由上海牵头组建瞄准行业重大需求
- WINCE6.0深入理解TOC
- 是什么优化让 .NET Core 性能飙升?
- Python网络编程(OSI模型、网络协议、TCP)
- (转)WebSphere的web工程中怎么获取数据源
- Dart语言精简入门介绍
- python中有哪些重要的书写规则_一文读懂Python代码的书写规范
- Eigen3的库使用
- 科技+铁腕齐下 济宁市智慧环保建设成效显著
- python 列表生成式 字典生成式
- Android小知识-剖析OkHttp中的五个拦截器(上篇)
- Sqoop Java API 导入应用案例
- 【Notification】屏蔽特定应用的通知提示
- Visual Studio中C++关于Unicode字符集和多字节字符集
- Win11 Windows聚焦失效修复方法
- ubuntu18 搜狗输入法不显示
- JAVA中成员变量和局部变量区别
- 模板 2018-01-27 分解因数 分解质因数