首页 > 其他分享 >2101. 引爆最多的炸弹 Medium

2101. 引爆最多的炸弹 Medium

时间:2024-07-22 10:59:18浏览次数:9  
标签:map 结点 Medium 到达 炸弹 bombs 2101 引爆

给你一个炸弹列表。一个炸弹的 爆炸范围 定义为以炸弹为圆心的一个圆。

炸弹用一个下标从 0 开始的二维整数数组 bombs 表示,其中 bombs[i] = [xi, yi, ri] 。xi 和 yi 表示第 i 个炸弹的 X 和 Y 坐标,ri 表示爆炸范围的 半径 。

你需要选择引爆 一个 炸弹。当这个炸弹被引爆时,所有 在它爆炸范围内的炸弹都会被引爆,这些炸弹会进一步将它们爆炸范围内的其他炸弹引爆。

给你数组 bombs ,请你返回在引爆 一个 炸弹的前提下,最多 能引爆的炸弹数目。

示例 1:

输入:bombs = [[2,1,3],[6,1,4]]
输出:2
解释:
上图展示了 2 个炸弹的位置和爆炸范围。
如果我们引爆左边的炸弹,右边的炸弹不会被影响。
但如果我们引爆右边的炸弹,两个炸弹都会爆炸。
所以最多能引爆的炸弹数目是 max(1, 2) = 2 。

示例 2:

输入:bombs = [[1,1,5],[10,10,5]]
输出:1
解释:
引爆任意一个炸弹都不会引爆另一个炸弹。所以最多能引爆的炸弹数目为 1 。

示例 3:

输入:bombs = [[1,2,3],[2,3,1],[3,4,2],[4,5,3],[5,6,4]]
输出:5
解释:
最佳引爆炸弹为炸弹 0 ,因为:
- 炸弹 0 引爆炸弹 1 和 2 。红色圆表示炸弹 0 的爆炸范围。
- 炸弹 2 引爆炸弹 3 。蓝色圆表示炸弹 2 的爆炸范围。
- 炸弹 3 引爆炸弹 4 。绿色圆表示炸弹 3 的爆炸范围。
所以总共有 5 个炸弹被引爆。

提示:

 ·1 <= bombs.length <= 100

 ·bombs[i].length == 3

 ·1 <= xi, yi, ri <= 105

题目大意:计算引爆一颗炸弹最多能引爆的炸弹数。

分析:

(1)本题可抽象为图的问题,若炸弹i能引爆炸弹j,则可视为炸弹i到炸弹j有一条有向边,因此可以抽象出一个有向图,则炸弹i可以引爆的炸弹数即为从结点i出发可到达的所有结点的总数(包括结点i);

(2)由(1)可将题目转换为计算从某个结点出发能到达的结点的总数的最大值。设map[i]表示结点i可以到达的结点的集合,如果i可以到达k,则k能到达的结点i也能到达,因此i能到达的结点可以更新为map[i]=map[i]∪map[k]。由此可以用Floyd算法计算出各个结点可以到达的所有结点,最终的答案即为map数组中最大的集合中的结点个数;

(3)由于map[i]只需记录结点i是否可以到达其它结点,因此可以用bitset实现map[i],则当i可以到达k时,map[i]|=map[k]。

class Solution {
public:
    int maximumDetonation(vector<vector<int>>& bombs) {
        int N=bombs.size();
        size_t ans=0;
        long long dis;
        vector<bitset<100>> map(N);
        for(int i=0,x1,y1,r1,x2,y2,r2;i<N;++i){
            x1=bombs[i][0];y1=bombs[i][1];r1=bombs[i][2];
            for(int j=i;j<N;++j){
                x2=bombs[j][0];y2=bombs[j][1];r2=bombs[j][2];
                dis=pow((x1-x2),2)+pow((y1-y2),2);
                if(dis<=(long long)r1*r1) map[i].set(j);
                if(dis<=(long long)r2*r2) map[j].set(i);
            }
        }
        for(int k=0;k<N;++k){
            for(int i=0;i<N;++i){
                //如果i可以到达k
                if(map[i].test(k)) map[i]|=map[k];
            }
        }
        for(const auto& bits:map) ans=max(ans,bits.count());
        return ans;
    }
};

标签:map,结点,Medium,到达,炸弹,bombs,2101,引爆
From: https://blog.csdn.net/m0_60444839/article/details/140603411

相关文章

  • 1186. 删除一次得到子数组最大和 Medium
    给你一个整数数组,返回它的某个 非空 子数组(连续元素)在执行一次可选的删除操作后,所能得到的最大元素总和。换句话说,你可以从原数组中选出一个子数组,并可以决定要不要从中删除一个元素(只能删一次哦),(删除后)子数组中至少应当有一个元素,然后该子数组(剩下)的元素总和是所有子数组之中......
  • 2850. 将石头分散到网格图的最少移动次数 Medium
    给你一个大小为 3*3 ,下标从 0 开始的二维整数矩阵 grid ,分别表示每一个格子里石头的数目。网格图中总共恰好有 9 个石头,一个格子里可能会有 多个 石头。每一次操作中,你可以将一个石头从它当前所在格子移动到一个至少有一条公共边的相邻格子。请你返回每个格子恰......
  • 代码随想录算法训练营第33天 | 贪心4:452. 用最少数量的箭引爆气球、435. 无重叠区间
    代码随想录算法训练营第33天|贪心4:452.用最少数量的箭引爆气球、435.无重叠区间、763.划分字母区间452.用最少数量的箭引爆气球https://leetcode.cn/problems/minimum-number-of-arrows-to-burst-balloons/description/代码随想录https://programmercarl.com/0452.用最......
  • 代码随想录day 31 用最少数量的箭引爆气球 | 无重叠区间 | 划分字母区间
    用最少数量的箭引爆气球用最少数量的箭引爆气球解题思路先根据数组中的第一个参数进行排序,之后通过记录最小右区间来判断是否重叠或者进入下个重叠区。贪心的思想是有重叠就尽可能地进行重叠,从而达到局部最优知识点重叠区间,贪心心得学会了如何判断和找寻重叠区间的方法无......
  • DMSQF ECO2101 Microeconomics
    DMSQF ECO2101 MicroeconomicsCA1 Individual Project - Instructions for StudentsJuly 2024 Semester (BLENDED)CA1 IndividualProjectAssessmentn This CA1 constitutes 30% of the overall ECO2101 Microeconomics course assessment. Rational......
  • Exact Neighbours (Medium)
    官解的方法二就是这篇博客(注意要先将\(a\)从小到大排序),补充一下,博客中说当\(a_j-j+1<0\)时,我们就找第\(j-a_j\)列的那个房子即可我在做的时候,也想到了逐个构造的方法,然而我在构造新的一列时,却总是想让这一列的房子与前一列的房子来配对,事实证明,我们构造的时候不要拘泥于数学归纳......
  • Studying-代码随想录训练营day30| 452.用最少数量的箭引爆气球、435.无重叠区间、763.
    第30天,贪心part04,加油,编程语言:C++目录452.用最少数量的箭引爆气球435.无重叠区间 763.划分字母区间 总结 452.用最少数量的箭引爆气球文档讲解:代码随想录用最少数量的箭引爆气球视频讲解:手撕用最少数量的箭引爆气球题目:学习:根据题干,很直观的贪心逻辑就是尽可......
  • 力扣-452. 用最少数量的箭引爆气球
    1.题目介绍题目地址(452.用最少数量的箭引爆气球-力扣(LeetCode))https://leetcode.cn/problems/minimum-number-of-arrows-to-burst-balloons/题目描述有一些球形气球贴在一堵用XY平面表示的墙面上。墙面上的气球记录在整数数组 points ,其中points[i]=[xstart,xend]......
  • stable-diffusion-3-medium 大模型下载地址
    由于huggingface.co下载速度不佳,放在夸克网盘上了:https://pan.quark.cn/s/6ab1885c2e51 有条件的可以从huggingface下载:https://huggingface.co/stabilityai/stable-diffusion-3-medium/tree/main StableDiffusion3Medium是基于OpenAI的扩散模型理论基础之上发展的......
  • 代码随想录算法训练营第第36天 | 452. 用最少数量的箭引爆气球、435. 无重叠区间、763
    今天的三道题目,都算是重叠区间问题,大家可以好好感受一下。都属于那种看起来好复杂,但一看贪心解法,惊呼:这么巧妙!这种题还是属于那种,做过了也就会了,没做过就很难想出来。不过大家把如下三题做了之后,重叠区间基本上差不多了用最少数量的箭引爆气球https://programmercarl.co......