蓝桥 种树问题
问题描述:
小明和朋友们一起去郊外植树,他们带了一些在自己实验室精心研究出的小树苗。
小明和朋友们一共有 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:
- 我脚得蓝桥杯的题目更多都是数学题,想不到一个好的算法、好的解决方案,可能就写不出来程序(或者说是好的程序)。考察的知识点其实都是很多语言中那些普遍共存的简单知识点,与实际开发中遇到实际问题的情况还是不一样的。
- 这道题网上没看到多少网友写过 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
- 写这道题的过程中,使用的是Eclipse,之前使用IDEA习惯了,反而有些不习惯;
- 写的过程中还碰到一个很尴尬的问题,
平方
的操作我写成了^2
,受其他语言的影响,我竟然一直没有发现这个低级的错误,导致找了很久错误,后来查看 API 文档才恍然大悟。还是基础知识不够扎实!- 有时候想问题不应该想的很复杂,我一开始写的时候,想的太复杂了,后来才想到上面这种简单有效的方法。