尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

洛谷 P10936 导弹防御塔 题解

洛谷 P10936 导弹防御塔 题解
📅 发布时间:2026/6/20 16:03:52

题目描述请移步 https://www.luogu.com.cn/problem/P10936

  • 题目简述

有n个防御塔,每个防御塔都有充足的导弹

导弹需要一定时间发出,又需要一定时间冷却

导弹有确定的速度,发出后会沿最短路径攻击任意一个入侵者

有m个入侵者,给定防御塔和入侵者的坐标,求至少多久才能击退所有入侵者

  • 解题思路

经过分析,发现直接求最少多久似乎不太可行,于是考虑二分,将问题转化为验证一个时长是否可行

在一定时间内,每个防御塔可以发射固定数量个导弹,这些导弹必须可以击中所有的入侵者,否则不可行

我们可以处理出每个入侵者能被哪些导弹击中(第i个防御塔第1枚,第i个防御塔第2枚...),他必须被其中一枚击中

这有些类似二分图,将入侵者看作一类点,防御塔看作一类点,入侵者与能击中其的导弹连边

image

如果最大匹配小于入侵者数量,则不可行;反之,则可行

这样的复杂度或许有些高,但"N,M≤50"的数据还是可以通过的

  • 易错点
  1. 题目中t1的单位是秒,需先转成分钟

  2. 本题许多变量涉及小数,如t1,二分l_r_mid,还有check函数上传的量,注意使用double

  3. 先输入的是m个入侵者的坐标,而非n个防御塔

  • 代码实现
#include <iostream>
#include <utility>
#include <vector>
#include <cmath>
#include <cstring>
#include <iomanip>
using namespace std;
const int MAX=55;
const int MAXK=2505; 
const double eps=1e-7;//二分精度 
int n,m;
double t1,t2,v;
pair <double,double> a[MAX],b[MAX];
vector <int> edge[MAX];//哪些防御塔能打到这个敌人 
int match[MAXK];//二分图匹配 
bool vis[MAXK];
double dis(int i,int j){//欧几里得距离 return sqrt((a[i].first-b[j].first)*(a[i].first-b[j].first)+(a[i].second-b[j].second)*(a[i].second-b[j].second));
}
bool find(int x){//二分图 for(int j=0;j<edge[x].size();j++){int now=edge[x][j];if(vis[now]==false){vis[now]=true;if(match[now]==0||find(match[now])==true){match[now]=x;return true;}}}return false;
}
bool check(double x){int tot=(x+t2)/(t1+t2);tot=min(tot,m);//总共能发射多少枚导弹 for(int j=1;j<=m;j++){//敌人 edge[j].clear();for(int i=1;i<=n;i++){//防御塔 for(int k=1;k<=tot;k++){if(dis(i,j)/v+k*t1+(k-1)*t2<=x){//可以打到 edge[j].push_back((i-1)*tot+k);} }}}memset(match,0,sizeof(match));for(int i=1;i<=m;i++){memset(vis,0,sizeof(vis));if(find(i)==false){//如果有一个入侵者无法被击退则不可行 return false;}}return true;
} 
int main(){cin>>n>>m>>t1>>t2>>v;t1=t1/60.0;//注意t1单位是秒 for(int i=1;i<=m;i++){cin>>b[i].first>>b[i].second;//入侵者 }for(int i=1;i<=n;i++){cin>>a[i].first>>a[i].second;//防御塔 }double l=0,r=1e9;while(r-l>eps){//小数二分 double mid=(l+r)/2.0;if(check(mid)==true){r=mid;}else{l=mid;}}cout<<fixed<<setprecision(6)<<l;//依据题意保留小数 
}

相关新闻

  • 初赛复习
  • 用户帐户控制(UAC)
  • 6款超好用的AI换脸软件,一键视频直播换脸(附下载链接)

最新新闻

  • 合肥口碑最好的中专选哪家?综合实力优选合肥理工学校! - 教育为先
  • 大众app抓包分析(cip)
  • Python 潮流周刊#155:Python 3.14 垃圾回收风波
  • 如何在5分钟内免费解锁Microsoft 365完整功能:终极激活指南
  • Wireshark中HTTPS证书分析与导出:从原理到实战的完整指南
  • 2026年北京应急电力设备、发电机、发电车租赁服务商精选:运力稳定与服务合规兼具的用电保障选择指南 - 海棠依旧大

日新闻

  • 信任的进化:技术实现详解——如何用JavaScript构建博弈论模拟器
  • Terrakube自定义工作流:如何集成OPA、Infracost等工具扩展IaC能力
  • grunt-concurrent快速入门:5分钟学会并行运行Grunt任务

周新闻

  • 3步解锁iOS设备:applera1n激活锁绕过完全指南
  • 39 2026 人工智能证书终极盘点,普通人选 AI 证书可以从这些方向入手
  • Redis 暴露公网有多危险?从端口检查到补救步骤

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号