藍橋杯 分巧克力(Java)

龍龍哥發表於2020-11-08

題目描述

兒童節那天有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

資源約定:
峰值記憶體消耗(含虛擬機器) < 256M
CPU消耗 < 1000ms

思路分析:

瞭解到這道題大多人是選擇類二分查詢,我是利用了嘗試法去暴力列舉,假設我以邊長1去切,看所有巧克力切完後是否滿足要求,如果滿足則再以邊長2去切,一直迴圈嘗試,直到累加到邊長為n時發現巧克力不夠切了,那麼最大的分割邊長就一定是n-1。

package 藍橋杯;

import java.util.*;

public class 分巧克力 {
	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		int n = in.nextInt();
		int k = in.nextInt();
		int[][] qkl = new int[n][2];
		int size = 1;
		//儲存所有巧克力資訊
		for(int i = 0;i < n;i++) {
			qkl[i][0] = in.nextInt();
			qkl[i][1] = in.nextInt();
		}
		int flag = 0;
		int sum = 0;
		//遍歷以當前邊計算,能否滿足
		while(true) {
			sum = 0;flag = 0;
			for(int i = 0;i < n;i++) {
				int a = qkl[i][0];//表示長
				int b = qkl[i][1];//表示寬
				sum += (a/size)*(b/size);//當前塊以當前尺寸分能分多少塊
				if(sum >= k) {
					size++;
					flag = 1;
					break;
				}
			}
			if(flag == 0)
				break;
				
		}
		System.out.print(size-1);
	}
}