藍橋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