蓝桥杯-分巧克力(java)

标题:分巧克力

儿童节那天有K位小朋友到小明家做客。小明拿出了珍藏的巧克力招待小朋友们。
小明一共有N块巧克力,其中第i块是Hi x Wi的方格组成的长方形。

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

形状是正方形,边长是整数  
大小相同  

例如一块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

代码部分

import java.util.Scanner;

public class 分巧克力 {

	static int n;// n块
	static int k;// k人

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		n = sc.nextInt();
		k = sc.nextInt();
		
		int a[][] = new int[n][2];//第一维用于表示第几块巧克力;第二维的空间大小为2,对应巧克力的高(Hi)、宽(Wi)
		
		for (int i = 0; i < n; i++) {
			a[i][0] = sc.nextInt();
			a[i][1] = sc.nextInt();
		}
		
		System.out.println(f(a));
	}
	
	static int f(int[][] a) {	
		int tem = k;//被分好的巧克力块个数,tem=k是进入while循环的初始条件
		int j=0;//边长

		while(tem>=k){//当被分好的巧克力块个数小于人数时就表示不够分了,循环结束
			tem = 0;
			j++;//从j=1开始
			for (int i = 0; i < n; i++) {//记录所有巧克力块(a[0]~a[n-1])被分成j*j大小的巧克力块的个数
				tem += cutNum(a[i], j);
			}
		}
		return j-1;//退出循环前j做了++操作,要减回去
	}

	static int cutNum(int[] arr, int j) {//j表示要分割的边长,这里的一维数组arr[]就是main函数里定义的二维数组a[][]的第二维
		return (arr[0] / j) * (arr[1] / j);//arr[0]表示高(Hi),arr[1]表示宽(Wi),
		//‘arr[0]/j’表示高(Hi)能被分成多少个连续的j份,相乘表示一个Hi*Wi的巧克力块可以被分成j*j个小巧克力块的个数
	}

}

第一次写博文,不到之处欢迎指正~~

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

草头苑

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值