标题:分巧克力
儿童节那天有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个小巧克力块的个数
}
}
第一次写博文,不到之处欢迎指正~~