蓝桥2019题一


蓝桥 种树问题

问题描述:

小明和朋友们一起去郊外植树,他们带了一些在自己实验室精心研究出的小树苗。
小明和朋友们一共有 n 个人,他们经过精心挑选,在一块空地上每个人挑选了一个适合植树的位置,总共 n 个。他们准备把自己带的树苗都植下去。
然而,他们遇到了一个困难:有的树苗比较大,而有的位置挨太近,导致两棵树植下去后会撞在一起。
他们将树看成一个圆,圆心在他们找的位置上。如果两棵树对应的圆相交,这两棵树就不适合同时植下(相切不受影响),称为两棵树冲突。
小明和朋友们决定先合计合计,只将其中的一部分树植下去,保证没有互相冲突的树。他们同时希望这些树所能覆盖的面积和(圆面积和)最大。

输入格式:

输入的第一行包含一个整数 n ,表示人数,即准备植树的位置数。
接下来 n 行,每行三个整数 x, y, r,表示一棵树在空地上的横、纵坐标和半径。

输出格式:

输出一行包含一个整数,表示在不冲突下可以植树的面积和。由于每棵树的面积都是圆周率的整数倍,请输出答案除以圆周率后的值(应当是一个整数)。

样例输入:

6
1 1 2
1 4 2
1 7 2
4 1 2
4 4 2
4 7 2

样例输出:

12

PS:

  1. 我脚得蓝桥杯的题目更多都是数学题,想不到一个好的算法、好的解决方案,可能就写不出来程序(或者说是好的程序)。考察的知识点其实都是很多语言中那些普遍共存的简单知识点,与实际开发中遇到实际问题的情况还是不一样的。
  2. 这道题网上没看到多少网友写过 Java 版的解答程序,这里分享一下。FH不多说,上代码!
import java.util.Scanner;
import java.lang.Math;

public class HelloWorld{
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		
		int numOfPerson = sc.nextInt();
		
		// 将树的圆心坐标 x,y及其半径r保存在一个二维数组中
		int[][] tree = new int [numOfPerson][3];
	
		// 存放种下的树的信息
		int[][] plant = new int [numOfPerson][3];
		
		int area = 0;// 因为不用加pi
		
		for(int i = 0;i < numOfPerson;i++) {
			
			tree[i][0] = sc.nextInt(); 
			tree[i][1] = sc.nextInt();
			tree[i][2] = sc.nextInt();
		}	
		sc.close();
		
		// 第一棵树直接种下
		plant[0][0] = tree[0][0];
		plant[0][1] = tree[0][1];
		plant[0][2] = tree[0][2];
		
		// 后面的每棵树与前面种下的每棵树进行比较
		for(int i = 1;i<tree.length;i++) {
			// 防止进行多余的计算,如果某棵树没有种下,则新的树不与该位置的000进行比较
			int j = 0;
			
			for(;j<plant.length;j++) {
				if(plant[j][0] == 0 && plant[j][1] ==0 && plant[j][2] == 0) {
					continue;
				}
				// 如果中间过程中就不满足条件,直接结束内层循环,进入下一次的外层循环
				if(Math.sqrt(Math.pow(tree[i][0]-plant[j][0], 2) + Math.pow(tree[i][1]-plant[j][1], 2)) 
						< (tree[i][2] + plant[j][2])){
					break;
				}
			}
			//如果此时是全部都判断了一次,退出循环不是因为不满足题设条件,而是因为循环判断的条件,则种树
			if(j == plant.length) {
				plant[i][0] = tree[i][0];
				plant[i][1] = tree[i][1];
				plant[i][2] = tree[i][2];
			}
			
		}
		// 计算所有种下的树的占地面积	
		for(int i = 0;i < plant.length;i++) {
			area += Math.pow(plant[i][2], 2); 
		}
		System.out.println(area);
		
	}	
}

运行结果:

6
1 1 2
1 4 2
1 7 2
4 1 2
4 4 2
4 7 2
12
  1. 写这道题的过程中,使用的是Eclipse,之前使用IDEA习惯了,反而有些不习惯;
  2. 写的过程中还碰到一个很尴尬的问题,平方的操作我写成了^2,受其他语言的影响,我竟然一直没有发现这个低级的错误,导致找了很久错误,后来查看 API 文档才恍然大悟。还是基础知识不够扎实!
  3. 有时候想问题不应该想的很复杂,我一开始写的时候,想的太复杂了,后来才想到上面这种简单有效的方法。


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM