タイトル説明
子供の日には、K人の子供たちがシャオミンの家をゲストとして訪れました。シャオミンは子供たちを楽しませるためにチョコレートのコレクションを取り出しました。
Xiao Mingには合計N個のチョコレートがあり、そのうちi番目のチョコレートはHi xWiの正方形で構成される長方形です。
为了公平起见,小明需要从这 N 块巧克力中切出K块巧克力分给小朋友们。切出的巧克力需要满足:
1. 形状是正方形,边长是整数
2. 大小相同
たとえば、6x5チョコレート1個で2x2チョコレート6個または3x3チョコレート2個をカットできます。
もちろん、子供たちはできるだけ大きなチョコレートを手に入れたいと思っています。リトルハイが最大の辺の長さを計算するのを手伝ってくれませんか。
入力
最初の行には、2つの整数NとKが含まれています。(1 <= N、K <= 100000)
次のN行のそれぞれには、2つの整数HiとWiが含まれています。(1 <=こんにちは、Wi <= 100000)
各子供が少なくとも1x1のチョコレートを手に入れることができるように入力します。
出力
カットされたスクエアチョコレートの可能な最大辺の長さを出力します。
サンプル入力:
2 10
6 5
5 6
サンプル出力:
2
リソース合意:
ピークメモリ消費量(仮想マシンを含む)<256MCPU
消費量<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);
}
}