トピックの説明
こどもの日、K 人の子供たちがゲストとして Xiao Ming の家にやって来ました。Xiao Ming は子供たちを楽しませるために、大切なチョコレートを取り出しました。
Xiao Ming は合計 N 個のチョコレートを持っており、そのうち i 番目のピースは Hi ×Wi の正方形で構成される長方形です。公平であるために、
Xiao Ming は、これらの N 個のチョコレートから K 個のチョコレートを切り取り、子供たちに配布する必要があります。カットチョコレートは以下を満たす必要があります:
1. 形状は正方形で、辺の長さは整数です。
2.同じサイズ;
たとえば、6x5 のチョコレートは 6 つの 2x2 チョコレートまたは 2 つの 3x3 チョコレートにカットできます。
もちろん、子供たちはみんなチョコレートをできるだけ大きくしたいと思っています. Xiao Ming が最大辺の長さを計算するのを手伝ってくれませんか?
入力の説明
最初の行には 2 つの整数 N、K) が含まれます。
次の N 行のそれぞれには、2 つの整数 Hi ,Wi が含まれています。
各子供が 1x1 のチョコレートを少なくとも 1 個獲得できるように入力してください。
出力の説明
切り抜いた四角いチョコレートの一辺の長さの最大値を出力します。
入力例
2 10
6 5
5 6
出力
2
ブルートフォースアルゴリズム
import java.util.Scanner;
// 1:无需package
// 2: 类名必须Main, 不可修改
//暴力
public class Main {
static int[] h=new int[1000001];//高
static int[] w=new int[1000001];//宽
static int N;
static int K;
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
//在此输入您的代码...
N=scan.nextInt();//N块
K=scan.nextInt();//切出K块
for(int i=0;i<N;i++){
h[i]=scan.nextInt();
w[i]=scan.nextInt();
}
int d=1;
while(true){
//从d=1开始一直往后找
if(checkId(d)){
d++;
}else{
break;
}
}
d--;//最后出来的d要记得减1
System.out.println(d);
scan.close();
}
public static boolean checkId(int d){
int sum=0;
for(int i=0;i<N;i++){
sum+=(h[i]/d)*(w[i]/d);//因为是矩形所以长/d的长度乘以宽/d的长度就是总的
}
if(sum>=K){
return true;
}else{
return false;
}
}
}
二分法
public class Main {
static int[] h=new int[1000001];//高
static int[] w=new int[1000001];//宽
static int N;
static int K;
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
//在此输入您的代码...
N=scan.nextInt();//N块
K=scan.nextInt();//切出K块
for(int i=0;i<N;i++){
h[i]=scan.nextInt();
w[i]=scan.nextInt();
}
int left=1;//左指针
int right=1000000;//右指针
int mid=0;
int ans=0;
while(left<=right){
mid=left-(left-right)/2;
if(checkId(mid)){
ans=mid;
left=mid+1;
}else{
right=mid-1;
}
}
System.out.println(ans);
scan.close();
}
public static boolean checkId(int d){
int sum=0;
for(int i=0;i<N;i++){
sum+=(h[i]/d)*(w[i]/d);
}
if(sum>=K){
return true;
}else{
return false;
}
}
}