题目链接:点击查看

题目大意:给出n个炮塔,再给出m个敌人,每个炮塔都可以持续发射导弹,不过发射导弹的时间是t1秒,炮塔冷却的时间是t2分钟,炮弹飞行的速度是v,炮塔和敌人之间的距离按照欧几里得距离计算,现在要求清除完所有敌人的最小时间(分钟)

题目分析:因为这个题目满足二分的基本条件,也就是在时间比较大的时候,也肯定是可以清除掉所有敌人的,所以我们可以二分一下清除所有敌人所用的时间,现在的问题就转换成了如何判断当前的答案是否合理了,很显然这个题目是一个二分图多重匹配的题目,因为每个炮塔可以和多个敌人匹配,但是又不是简单的多重匹配,因为每一个导弹的时间开销都是互不相同的,我们必须保证每一个导弹在击中敌人的时候,时间还在二分的答案范围内才行,这样我们可以预处理出每一个导弹发射的时间,然后每次检查答案的时候,我们需要重新建边,建好边后跑一下匈牙利就可以判断答案的合理性了

因为这个题目的多重匹配对于炮塔而言,每一次的时间状态都是互不相同的,所以这个题目我们选择用拆点法来处理,将每一个炮塔拆成m个点来处理即可(因为最坏情况是一个炮塔发射了m颗导弹),然后实现就可以了

代码:

#include<iostream>
#include<cstdlib>
#include<string>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<climits>
#include<cmath>
#include<cctype>
#include<stack>
#include<queue>
#include<list>
#include<vector>
#include<set>
#include<map>
#include<sstream>
using namespace std;typedef long long LL;const int inf=0x3f3f3f3f;const int N=55;const double eps=1e-8;int n,m;double t1,t2,v;struct Pos
{int x,y;
}a[N],b[N];//a:敌人 b:炮塔 double dis(Pos& a,Pos& b)
{return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}struct Node
{double time;int id;
}c[N*N];int cnt;bool maze[N*N][N*N],vis[N*N];int match[N*N];bool dfs(int x)
{for(int i=1;i<=cnt;i++){if(maze[x][i]&&!vis[i]){vis[i]=true;if(!match[i]||dfs(match[i])){match[i]=x;return true;}}}return false;
}bool check(double mid)
{memset(maze,false,sizeof(maze));memset(match,0,sizeof(match));for(int i=1;i<=m;i++)//根据当前二分的mid建边,边权必须满足小于等于midfor(int j=1;j<=cnt;j++){if(dis(a[i],b[c[j].id])/v+c[j].time<=mid)maze[i][j]=true;}for(int i=1;i<=m;i++){memset(vis,false,sizeof(vis));if(!dfs(i))return false;}return true;
}int main()
{
//  freopen("input.txt","r",stdin);
//  ios::sync_with_stdio(false);scanf("%d%d%lf%lf%lf",&n,&m,&t1,&t2,&v);t1/=60;//注意这里,是个小坑,给出的t1单位是秒for(int i=1;i<=m;i++)scanf("%d%d",&a[i].x,&a[i].y);for(int i=1;i<=n;i++)scanf("%d%d",&b[i].x,&b[i].y);for(int i=1;i<=n;i++)//枚举炮塔 for(int j=1;j<=m;j++)//枚举第几个导弹 (最多用一个炮塔发射m颗导弹就够了){c[++cnt].id=i;c[cnt].time=(j-1)*(t1+t2)+t1; } double l=0,r=1e5;while(fabs(l-r)>=eps)//二分答案{double mid=(l+r)/2;if(check(mid))r=mid;elsel=mid;}printf("%.6f\n",r);return 0;
}

CH - 6803 导弹防御塔(二分图最大匹配-多重匹配(拆点法))相关推荐

  1. [tyvj1935 Poetize3]导弹防御塔 (二分图多重匹配)

    传送门 Description Freda控制着N座可以发射导弹的防御塔.每座塔都有足够数量的导弹,但是每座塔每次只能发射一枚.在发射导弹时,导弹需要T1秒才能从防御塔中射出,而在发射导弹后,发射这枚 ...

  2. 导弹防御塔---二分图匹配《lyd算法进阶》

    题目描述 Freda控制着N座可以发射导弹的防御塔.每座塔都有足够数量的导弹,但是每座塔每次只能发射一枚.在发射导弹时,导弹需要T1秒才能从防御塔中射出,而在发射导弹后,发射这枚导弹的防御塔需要T2分 ...

  3. POJ - 2112 Optimal Milking(二分+二分图最大匹配-多重匹配(修改匈牙利实现)+Floyd求最短路)

    题目链接:点击查看 题目大意:给出n个牛奶机器,再给出m只奶牛,每个机器只能让最多k只牛一起挤奶,现在问如何分配奶牛,能让最远的那只奶牛到达机器的距离最小 题目分析:很综合的一道题目了,不算很难,但比 ...

  4. POJ - 3614 Sunscreen(贪心/二分图最大匹配-多重匹配/网络流-最大流)

    题目链接:点击查看 题目大意:给出n头奶牛,奶牛们现在要晒太阳,每头奶牛需要[l,r]区间内的光照强度,现在有m种防晒霜,每种防晒霜可以让奶牛接受到val数值的光照强度,然后每种防晒霜只有num个,现 ...

  5. 374. 导弹防御塔

    Freda 的城堡遭受了 M 个入侵者的攻击! Freda 控制着 N 座导弹防御塔,每座塔都有足够数量的导弹,但是每次只能发射一枚. 在发射导弹时,导弹需要 T1 秒才能从防御塔中射出,而在发射导弹 ...

  6. 【NOIP2013模拟】导弹防御塔

    题目 Freda的城堡-- "Freda,城堡外发现了一些入侵者!" "喵-刚刚探究完了城堡建设的方案数,我要歇一会儿嘛lala~" "可是入侵者已经 ...

  7. CH - 6802 車的放置(二分图最大匹配)

    题目链接:点击查看 题目大意:给出一个n*m的棋盘,其中有t个点是禁止放置的,我们需要在其余的点上尽可能多的放置车,并且互不冲突,车的攻击规则和中国象棋中的车一样,只能攻击同一行和同一列中的所有棋子, ...

  8. 图论:二分图多重匹配

    使用最大流和费用流解决二分图的多重匹配 之前编辑的忘存了好气啊.. 本来打算学完二分图的乱七八糟的匹配之后再去接触网络流的,提前撞到了 之前我们说的二分图最大匹配和二分图最大权匹配有一个特点,那就是没 ...

  9. POJ - 2289 Jamie's Contact Groups(二分图多重匹配)

    题目链接:点击查看 题目大意:给出n个联系人,以及m个分组,现在需要将n个联系人分到m个分组中,需要满足让人数最多的组的人数最少,输出这个值 题目分析:因为是让最大值最小,所以肯定是要用二分解决,因为 ...

最新文章

  1. 第二步 (仅供参考) sencha touch + PhoneGap(cordova 2.9 及其以下版本) 使用 adt eclipse进行打包...
  2. beta阶段140字评论
  3. TensorFlow2简单入门-三维张量
  4. leetcode刷题之树(1)
  5. 字节跳动 2019 ICME 双赛道冠军团队方案分享
  6. C语言程序设计--输入与输出
  7. c++:json字符串拼接,json对象组装
  8. 算法题目——子序列和问题(poj-3061)(尺取法)
  9. mongodb 查询内嵌文档
  10. python白盒测试_白盒测试方法
  11. python中字典和json的区别_详解python中的json和字典dict
  12. SpringMVC@RequestMapping请求方法限定与请求参数限定
  13. python中怎样划分时间段_如何划分重叠的日期时间间隔(组织模式时钟时间)?...
  14. win7开机有画面进系统黑屏怎么办
  15. Hibernate完全自学手册
  16. 如何出一幅具有三维立体显示的地形示意图
  17. 发送RST报文的几种可能的情况
  18. 使用Java语言打印一个爱心图案
  19. 《月下独酌》赏析-(李白明月姑娘之一)
  20. 在设备树中时钟的简单使用

热门文章

  1. MySQL通过安装包提供的卸载功能卸载
  2. explain 之key rows extra
  3. 执行引擎(Query Execution Engine),返回结果
  4. 配置Swagger2
  5. 分布式缓存Redis介绍
  6. request的其他细节
  7. 基本的SQL-SELECT语句
  8. Oracle之用户操作
  9. RocketMQ API使用简介、拉取机制
  10. Shell变量作用域