蓝桥杯 19. 植树

植树

题目描述

小明和朋友们一起去郊外植树,他们带了一些在实验室中精心研究出的小树苗。

一共有 n 个人,每个人挑选了一个适合植树的位置,一共 n 个位置。每人准备在自己的位置种下一棵树苗。

但他们遇到一个问题:有的树苗比较大,而有的位置太近,如果同时种下会"撞到一起"。

我们将每棵树视为一个圆,圆心是植树的位置,半径为树的半径。如果两棵树的圆相交(相切不算),那么这两棵树不能同时种下,称为发生冲突

他们决定只选择其中一部分树苗种下去,要求:

  • 没有任意两棵树发生冲突;
  • 所有种下树的面积总和最大

输入描述

  • 第一行一个整数 n(1 ≤ n ≤ 30),表示准备植树的位置数。
  • 接下来 n 行,每行三个整数 x y r,表示树苗的种植位置坐标 (x, y) 和树的半径 r

其中:

  • 0 ≤ x, y ≤ 1000
  • 1 ≤ r ≤ 1000

输出描述

输出一个整数,表示在不冲突的情况下,可以植树的总面积除以 π 的值

因为每棵树的面积为 π * r²,所以答案是总面积除以 π 后的整数。

输入示例

in 复制代码
6
1 1 2
1 4 2
1 7 2
4 1 2
4 4 2
4 7 2

输出示例

out 复制代码
12

c++代码

cpp 复制代码
#include<bits/stdc++.h>

using namespace std;

struct cir{
    int x, y, r;
};

int n, ans = 0;
vector<cir> cirs, mid;

void dfs(int index, int tem) {
    if (index == cirs.size()) {
        ans = max(ans, tem);
        return;
    }
    bool key = true;
    for (int i = 0; i < mid.size() && key; i++) {
        if ((mid[i].x - cirs[index].x) * (mid[i].x - cirs[index].x) + (mid[i].y - cirs[index].y) * (mid[i].y - cirs[index].y) < (mid[i].r + cirs[index].r) * (mid[i].r + cirs[index].r)) key = false;
    }
    dfs(index + 1, tem);
    if (key) mid.push_back(cirs[index]), dfs(index + 1, tem + cirs[index].r * cirs[index].r), mid.pop_back();
}

int main() {
    cin >> n;
    cirs = vector<cir>(n);
    for (int i = 0; i < n; i++) cin >> cirs[i].x >> cirs[i].y >> cirs[i].r;
    dfs(0, 0);
    cout << ans;
    return 0;
}//by wqs

题目解析

dfs+剪枝,如果已经选择的有和当前节点冲突,则不能选

相关推荐
阿猿收手吧!2 分钟前
【高并发服务器】多路复用的总结 eventfd timerfd
服务器·c++·计算机网络
xindafu19 分钟前
代码随想录算法训练营第五十天|图论part1
c语言·算法·图论
满分观察网友z42 分钟前
从选择困难到最优策略:我如何用DP搞定“鱼和熊掌兼得”的排程难题(1751. 最多可以参加的会议数目 II)
后端·算法
满分观察网友z1 小时前
从一团乱麻到井然有序:我的海量任务调度“秘密武器”( 1353. 最多可以参加的会议数目)
算法
m0_535064601 小时前
C++类模版与友元
java·c++·算法
山河木马1 小时前
前端学C++可太简单了:导入标准库
前端·javascript·c++
满分观察网友z2 小时前
从“最短响应路径”到二叉树最小深度:一个Bug引发的BFS探险之旅(111. 二叉树的最小深度)
后端·算法
阿里云大数据AI技术2 小时前
Post-Training on PAI (4):模型微调SFT、DPO、GRPO
人工智能·算法·云计算
CoovallyAIHub2 小时前
卷积网络到底能不能“定位”?一次对空间表示能力的深度解析
深度学习·算法·计算机视觉
Am心若依旧4092 小时前
C++设计模式之创建型模式
java·开发语言·数据结构·c++·设计模式