藍橋 種樹問題
問題描述:
小明和朋友們一起去郊外植樹,他們帶了一些在自己實驗室精心研究出的小樹苗。
小明和朋友們一共有 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 文檔才恍然大悟。還是基礎知識不夠扎實!- 有時候想問題不應該想的很復雜,我一開始寫的時候,想的太復雜了,后來才想到上面這種簡單有效的方法。