蓝桥模拟2第九题题解

题目描述

  小明和朋友们一起去郊外植树,他们带了一些在自己实验室精心研究出的小树苗。
  小明和朋友们一共有 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

评测用例规模与约定

  对于 30% 的评测用例,1 <= n <= 10;
  对于 60% 的评测用例,1 <= n <= 20;
  对于所有评测用例,1 <= n <= 30,0 <= x, y <= 1000,1 <= r <= 1000。

题目大意

每棵树都占有一定的面积,求出如何种树,在面积不冲突的情况下,占有的最大面积。

解题思路

比赛的时候根本没想到用DFS。。。

看了学长的代码才发现可以用DFS。

用dfs遍历每一颗树,求出最大值,数据不是很大。

(DFS,BFS。。。技术盲区啊

还是要去多学学搜索,多写写题。

完整代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;

struct {
int x;
int y;
int r;
}a[35];
int ans = 0, n, flag[35];

int check(int node) {
for (int i = 1; i <= n; i++) {
if (i != node && flag[i]) {
double d = sqrt(pow(a[node].x - a[i].x, 2) + pow(a[node].y - a[i].y, 2));
if (d < (double)a[node].r + a[i].r) return 0;
}
}
return 1;
}

void dfs(int num,int sum) {
if (num == n) {
ans = max(ans, sum);
}
else {
for (int i = 1; i <= n; i++) {
if (!flag[i]) {
flag[i] = 1;
if (check(i)) {
dfs(num + 1, sum + pow(a[i].r, 2));
}
else {
dfs(num + 1, sum);
}
flag[i] = 0;
}
}
}
}

int main() {

cin >> n;
for (int i = 1; i <= n; i++) {
cin >> a[i].x >> a[i].y >> a[i].r;
}
dfs(1, 0);
cout << ans << endl;
}
  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!
  • © 2015-2021 sakurakarma
  • Powered by Hexo Theme Ayer
  • PV: UV:

请我喝杯咖啡吧~

支付宝
微信