蓝桥杯第八届省赛JAVA真题----分巧克力
2018-03-30 15:21
465 查看
标题: 分巧克力
儿童节那天有K位小朋友到小明家做客。小明拿出了珍藏的巧克力招待小朋友们。
小明一共有N块巧克力,其中第i块是Hi x Wi的方格组成的长方形。
为了公平起见,小明需要从这 N 块巧克力中切出K块巧克力分给小朋友们。切出的巧克力需要满足:
1. 形状是正方形,边长是整数
2. 大小相同
3.
例如一块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
资源约定:
峰值内存消耗(含虚拟机) < 256M
CPU消耗 < 1000ms
请严格按要求输出,不要画蛇添足地打印类似:“请您输入…” 的多余内容。
所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
不要使用package语句。不要使用jdk1.7及以上版本的特性。
主类的名字必须是:Main,否则按无效代码处理。
解析:对于这个题目,我们可能会纠结与如何保证多块巧克力同时能够被切割成指定块数。其实不过是枚举罢了,我们从大到小进行枚举,找到一个最大的分发能够满足指定块数就可以了。下面采用了二分法进行查找合适大小。
儿童节那天有K位小朋友到小明家做客。小明拿出了珍藏的巧克力招待小朋友们。
小明一共有N块巧克力,其中第i块是Hi x Wi的方格组成的长方形。
为了公平起见,小明需要从这 N 块巧克力中切出K块巧克力分给小朋友们。切出的巧克力需要满足:
1. 形状是正方形,边长是整数
2. 大小相同
3.
例如一块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
资源约定:
峰值内存消耗(含虚拟机) < 256M
CPU消耗 < 1000ms
请严格按要求输出,不要画蛇添足地打印类似:“请您输入…” 的多余内容。
所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
不要使用package语句。不要使用jdk1.7及以上版本的特性。
主类的名字必须是:Main,否则按无效代码处理。
解析:对于这个题目,我们可能会纠结与如何保证多块巧克力同时能够被切割成指定块数。其实不过是枚举罢了,我们从大到小进行枚举,找到一个最大的分发能够满足指定块数就可以了。下面采用了二分法进行查找合适大小。
import java.util.Scanner; class Cho { int h; int w; public Cho(int h, int w) { // TODO Auto-generated constructor stub this.h = h; this.w = w; } } public class Main2 { static int n, k; static Cho[] cho; public static void main(String[] args) { Scanner in = new Scanner(System.in); n = in.nextInt(); k = in.nextInt(); int low = 1; int mid = 0; int high = 100000; cho = new Cho ; for (int i = 0; i < n; i++) { int a = in.nextInt(); int b = in.nextInt(); cho[i] = new Cho(a, b); } // 二分,基本思路为暴力,从大到小能够保证最先出来的结果就是符合要求的最大情况 while (low < high -1) { mid = (low + high) /2; if (!judge(mid)) { high = mid; } else { low = mid; } } System.out.println(mid - 1); } private static boolean judge(int l) { // TODO Auto-generated method stub int sum = 0; for (int i = 0; i < n; i++) { sum += (cho[i].h * cho[i].w) / (l * l); if (sum >= k) { return true; } } return false; } }
相关文章推荐
- 蓝桥杯第八届省赛JAVA真题----方格分割
- 蓝桥杯第八届省赛JAVA真题----正则问题
- 蓝桥杯第八届省赛JAVA真题----油漆面积
- 蓝桥杯第八届省赛JAVA真题----包子凑数
- 蓝桥杯第八届省赛JAVA真题----字母组串
- 蓝桥杯第八届省赛JAVA真题----9数算式
- 蓝桥杯第八届省赛JAVA真题----最大公共子串
- 蓝桥杯第八届省赛JAVA真题----Excel地址
- 蓝桥杯第八届省赛JAVA真题----承压计算
- 蓝桥杯第八届省赛JAVA真题----拉马车
- 蓝桥杯第八届省赛JAVA真题----迷宫
- 蓝桥杯第八届省赛JAVA真题----日期问题
- 第七届蓝桥杯Java语言B组真题(省赛)
- 第八届 蓝桥杯 c/c++ B组 省赛 (9)——分巧克力
- 蓝桥杯第六届省赛JAVA真题----打印菱形
- 第八届蓝桥杯JAVA B组【省赛】
- 第八届蓝桥杯B组java省赛 日期问题
- 蓝桥杯第五届省赛JAVA真题----单位分数
- 蓝桥杯第三届省赛JAVA真题----取球博弈
- 蓝桥杯第五届省赛JAVA真题----n级台阶