蓝桥杯试题真题Java分巧克力

前言:

这是一篇有思想的博客

思想在问题描述后

网上也有很多的解决方案,有的是压根就是错误的逻辑思维根本不能解决问题,或者代码比这个还要长,不简洁,综合之下,有了这一篇博客。

代码长度不足1kb

问题描述
  儿童节那天有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

问题分析以及代码实现

首先可以知道,输入的是巧克力的块数和人数
然后输入的是每一块巧克力的规格

我们可以根据封装的思想把巧克力封装在一个二维数组里
每个一维数组就是一块巧克力,一维数组里存放了巧克力的规格

输出的结果是一个整数,就是相当于一个标准,按照这个标准切,小朋友最开心

扫描二维码关注公众号,回复: 9982601 查看本文章

问题的核心就是如何确定这个标准
标准最大也就是所有巧克力当中宽度最大的那个数
最小是1
可能是中间的任何一个整数
因为巧克力的规格不确定块数人数都不确定,存在有的巧克力不用被切,人数只有一人,有的巧克力很大的情况。
从1和最大之间找出这个数,用二分法查找就解决了问题

import java.util.Scanner;

public class two2 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sc=new Scanner(System.in);
		int a=sc.nextInt();
		int b=sc.nextInt();
		int[][] arr=new int[a][2];
		//存放巧克力
		for(int x=0;x<a;x++) {
			for(int y=0;y<2;y++) {
				arr[x][y]=sc.nextInt();
			}
		}
		int temp=name(arr, b);
		System.out.println(temp);
	}
	public static int name(int [][]arr,int b) {
		int a=0;//标准
		//确定最大标准数
		for(int x=0;x<arr.length;x++) {		
			int y=arr[x][0]>arr[x][1]?arr[x][1]:arr[x][0];
			a=a>y?a:y;
		}
		int i=1;//游标
		int w=0;//返回值
		for(;!(w==a||a-w==1);) {
			int y=(a+i)/2;
			if(kits(arr,y)>=b) {
				i=y;
				w=y;
				y=(a+i)/2;				
			}else {
				a=y-1;
			}
		}
//		System.out.println("我是标准"+w);
//		System.out.println("我能分出"+kits(arr, w)+"块巧克力");
		if(kits(arr, w+1)>=b) {
//			System.out.println("123");
			return w+1;
		}
		else {
			return w;
		}	
	}
	//按标准切一块巧克力获得的块数
	public static int kit(int[] arr,int c) {
		int x=arr[0]/c;
		int y=arr[1]/c;		
		return x*y;
	}
	//按标准切很多块巧克力获得的块数
	public static int kits(int[][] arr,int y) {
		int temp=0;
		for(int x=0;x<arr.length;x++) {
			temp=temp+kit(arr[x], y);		
		}
		return temp;
	}

}

重点

先找思路在写代码,你就会快很多

发布了3 篇原创文章 · 获赞 8 · 访问量 375

猜你喜欢

转载自blog.csdn.net/dada4215/article/details/104981951