小明植樹
題目
問題描述
java
小明和朋友們一塊兒去郊外植樹,他們帶了一些在本身實驗室精心研究出的小樹苗。
小明和朋友們一共有 n 我的,他們通過精心挑選,在一塊空地上每一個人挑選了一個適合植樹的位置,總共 n 個。他們準備把本身帶的樹苗都植下去。
然而,他們遇到了一個困難:有的樹苗比較大,而有的位置挨太近,致使兩棵樹植下去後會撞在一塊兒。
他們將樹當作一個圓,圓心在他們找的位置上。若是兩棵樹對應的圓相交,這兩棵樹就不適合同時植下(相切不受影響),稱爲兩棵樹衝突。
小明和朋友們決定先合計合計,只將其中的一部分樹植下去,保證沒有互相沖突的樹。他們同時但願這些樹所能覆蓋的面積和(圓面積和)最大。
markdown
輸入格式spa
輸入的第一行包含一個整數 n ,表示人數,即準備植樹的位置數。
接下來 n 行,每行三個整數 x, y, r,表示一棵樹在空地上的橫、縱座標和半徑。
.net
輸出格式code
輸出一行包含一個整數,表示在不衝突下能夠植樹的面積和。因爲每棵樹的面積都是圓周率的整數倍,請輸出答案除以圓周率後的值(應當是一個整數)。blog
樣例輸入get
6
1 1 2
1 4 2
1 7 2
4 1 2
4 4 2
4 7 2
it
樣例輸出class
12import
評測用例規模與約定
對於 30% 的評測用例,1 <= n <= 10;
對於 60% 的評測用例,1 <= n <= 20;
對於全部評測用例,1 <= n <= 30,0 <= x, y <= 1000,1 <= r <= 1000。
package 省模擬賽; import java.util.Scanner; public class 植樹2 { public static boolean[][] bool = new boolean[31][31]; static boolean[] vis = new boolean[31]; public static int[] x = new int[31]; public static int[] y = new int[31]; public static int[] r = new int[31]; public static int n = 0, max = -1; public static void main(String[] args) { Scanner sc = new Scanner(System.in); n = sc.nextInt(); for (int i = 1; i <= n; i++) { x[i] = sc.nextInt(); y[i] = sc.nextInt(); r[i] = sc.nextInt(); } for (int i = 1; i <= n; i++) { for (int j = i + 1; j <= n; j++) { boolean bo = ((x[i] - x[j]) * (x[i] - x[j]) + (y[i] - y[j]) * (y[i] - y[j]) > (r[i] + r[j]) * (r[i] + r[j])); bool[i][j] = bo; bool[j][i] = bo; } } sc.close(); dfs(1); System.out.println(max); } public static void dfs(int step) { if (step > n) { int sum = 0; for (int i = 1; i <= n; i++) { if (vis[i]) { sum += (r[i] * r[i]); } } max = Math.max(sum, max); return; } vis[step] = false; dfs(step + 1); for (int i = 1; i < step; i++) { if (vis[i] && !bool[i][step]) { return; } } vis[step] = true; dfs(step + 1); } }