ブルーブリッジチョコレート

トピックの説明
こどもの日、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;
      }

    }
}

おすすめ

転載: blog.csdn.net/ChenYiRan123456/article/details/129768923