二分+最大流

首先考虑二分答案

然后可以发现对于已知时间,判断是否可以将所有机器人摧毁可以用网络流

建立源点和汇点,源点向每一个激光武器连一条容量为$time*b[i]$的边,表示该激光武器在$time$时间下最多能产生的伤害为$time*b[i]$

每一个机器人向汇点连一条容量为$a[i]$的边,表示每一个机器人最多能承受的伤害

中间每一个激光武器向其能攻击的机器人连一条容量为$inf$的边

然后跑最大流,若可以跑出$\sum a[i]$,那么该时间可以将所有与机器人摧毁,更新二分边界

  1 #include <bits/stdc++.h>
2 #define inf 1e9
3 using namespace std;
4 const int N=210,M=6100;
5 int n,m,s,t,tot,first[N],nxt[M],point[M],nrl[N],d[N];
6 int vi[N][N];
7 double data[M],a[N],b[N],sum;
8 void add_edge(int x,int y,double z)
9 {
10 tot++;
11 nxt[tot]=first[x];
12 first[x]=tot;
13 point[tot]=y;
14 data[tot]=z;
15 tot++;
16 nxt[tot]=first[y];
17 first[y]=tot;
18 point[tot]=x;
19 data[tot]=0;
20 }
21 bool bfs()
22 {
23 queue <int> q;
24 for (int i=s;i<=t;i++)
25 {
26 d[i]=inf;
27 nrl[i]=first[i];
28 }
29 d[s]=0;q.push(s);
30 while (!q.empty())
31 {
32 int x=q.front();
33 q.pop();
34 for (int i=first[x];i!=-1;i=nxt[i])
35 {
36 int u=point[i];
37 if (data[i]>0 && d[u]>d[x]+1)
38 {
39 d[u]=d[x]+1;
40 if (u==t) return true;
41 q.push(u);
42 }
43 }
44 }
45 return false;
46 }
47 double dfs(int x,double flow)
48 {
49 if (x==t) return flow;
50 double sum=0;
51 for (int i=nrl[x];i!=-1;i=nxt[i])
52 {
53 int u=point[i];
54 if (data[i]>0 && d[u]==d[x]+1)
55 {
56 double tmp=dfs(u,min(flow,data[i]));
57 flow-=tmp;sum+=tmp;
58 data[i]-=tmp;data[i^1]+=tmp;
59 if (flow<=0) return sum;
60 }
61 nrl[x]=nxt[i];
62 }
63 return sum;
64 }//使用dinic跑最大流
65 bool check(double mid)
66 {
67 tot=-1;
68 memset(first,-1,sizeof(first));
69 memset(nxt,-1,sizeof(nxt));
70 s=0;t=n+m+1;//同上建边
71 for (int i=1;i<=m;i++) add_edge(s,i,mid*b[i]);
72 for (int i=1;i<=n;i++) add_edge(m+i,t,a[i]);
73 for (int i=1;i<=m;i++)
74 {
75 for (int j=1;j<=n;j++)
76 {
77 if (vi[i][j]) add_edge(i,m+j,inf);
78 }
79 }
80 double ans=0;
81 while (bfs()) ans+=dfs(s,inf);
82 return ans==sum;//判断是否跑满
83 }
84 int main()
85 {
86 scanf("%d%d",&n,&m);
87 for (int i=1;i<=n;i++) scanf("%lf",&a[i]);
88 for (int i=1;i<=m;i++) scanf("%lf",&b[i]);
89 for (int i=1;i<=m;i++)
90 {
91 for (int j=1;j<=n;j++)
92 scanf("%d",&vi[i][j]);
93 }
94 sum=0;
95 for (int i=1;i<=n;i++) sum+=a[i];
96 double l=0,r=1e8;
97 while ((r-l)>=1e-8)
98 {
99 double mid=(l+r)/2;
100 if (check(mid)) r=mid;
101 else l=mid;
102 }
103 printf("%.6lf\n",r);
104 }

Luogu P3324 [SDOI2015]星际战争的更多相关文章

  1. BZOJ 3993 Luogu P3324 [SDOI2015]星际战争 (最大流、二分答案)

    字符串终于告一段落了! 题目链接: (bzoj) https://www.lydsy.com/JudgeOnline/problem.php?id=3993 (luogu) https://www.l ...

  2. 洛谷P3324 [SDOI2015]星际战争

    题目:洛谷P3324 [SDOI2015]星际战争 思路: 类似<导弹防御塔>,因为题目保证有解,花费时间小于最终答案时一定无法消灭所有敌人,只要花费时间大于等于最终答案都可以消灭所有敌人 ...

  3. P3324 [SDOI2015]星际战争

    传送门:https://www.luogu.org/problemnew/show/P3324 首先瞅一眼数据范围,发现m, n都很小,所以就可以初步断定这是一道网络流的题. 因为题中说每一个武器只能 ...

  4. 洛谷P3324 [SDOI2015]星际战争 题解

    题目链接: https://www.luogu.org/problemnew/show/P3324 分析: 因为本题的时间点较多,不能枚举,但发现有单调性,于是二分答案,二分使用的时间TTT 每个攻击 ...

  5. 洛谷$P3324\ [SDOI2015]$星际战争 网络流+二分

    正解:网络流+二分 解题报告: 传送门$QwQ$ 其实我第一反应是费用流来着,,,但是仔细想了下发现我不会实现各个武器之间独立同时?而且攻击是连续的答案可能是小数嘛$QwQ$. 所以显然不是递推就二分 ...

  6. BZOJ 3993: [SDOI2015]星际战争 [二分答案 二分图]

    3993: [SDOI2015]星际战争 题意:略 R1D2T1考了裸二分答案+二分图最大匹配... #include <iostream> #include <cstdio> ...

  7. BZOJ_3993_[SDOI2015]星际战争_二分+网络流

    BZOJ_3993_[SDOI2015]星际战争_二分+网络流 Description 3333年,在银河系的某星球上,X军团和Y军团正在激烈地作战.在战斗的某一阶段,Y军团一共派遣了N个巨型机器人进 ...

  8. bzoj千题计划131:bzoj3993: [SDOI2015]星际战争

    http://www.lydsy.com/JudgeOnline/problem.php?id=3993 二分答案 源点向武器连 mid*攻击力的边 机器人向汇点连 防御力 的边 武器i能攻击机器人j ...

  9. 3993: [SDOI2015]星际战争

    3993: [SDOI2015]星际战争 Time Limit: 10 Sec  Memory Limit: 128 MBSec  Special JudgeSubmit: 1244  Solved: ...

随机推荐

  1. 使用SSM框架实现图片的上传

    SSM实现图片上传功能 效果 在前端页面点击上传图片功能按钮,即弹出文件管理器,选择图片并上传: 思路 在前端页面添加 input 标签,type选择file. 在后端controller编写方法. ...

  2. vs工程生成dll文件及其调用方法

    转载:https://blog.csdn.net/weixin_44536482/article/details/91519413 vs工程生成dll文件及其调用方法                  ...

  3. 【题解】CF940F Machine Learning

    Link 题目大意:单点修改,每次询问一个区间的所有颜色出现次数的\(\text{Mex}.\) 例如,区间中三种颜色分别出现了\(2,2,3\)次,又因为其他颜色出现次数一定是\(0\),所以这里的 ...

  4. Talk is cheap. Show me the code的由来

    Date: Fri, 25 Aug 2000 11:09:12 -0700 (PDT) From:Linus Torvalds Subject Re: SCO: "thread creati ...

  5. 你知道CPU结构也会影响Redis性能吗?

    啦啦啦,我是卖身不卖艺的二哈,ε=(´ο`*)))唉错啦(我是开车的二哈),我又来了,铁子们一起开车呀! 今天来分析下CPU结构对Redis性能会有影响吗? 在进行Redis性能分析的时候,通常我们会 ...

  6. 唯品会Java开发手册》1.0.2版阅读

    <唯品会Java开发手册>1.0.2版阅读 1. 概述 <阿里巴巴Java开发手册>,是首个对外公布的企业级Java开发手册,对整个业界都有重要的意义. 我们结合唯品会的内部经 ...

  7. 2014年 实验二 B2C网上购物

    实验二 B2C网上购物 [实验目的] ⑴.熟悉虚拟银行和网上支付的应用 ⑵.熟悉并掌握消费者B2C网上购物和商家的销售处理 [实验条件] ⑴.个人计算机一台 ⑵.计算机通过局域网形式接入互联网 (3) ...

  8. python算法常用技巧与内置库

    python算法常用技巧与内置库 近些年随着python的越来越火,python也渐渐成为了很多程序员的喜爱.许多程序员已经开始使用python作为第一语言来刷题. 最近我在用python刷题的时候想 ...

  9. go sync.WaitGroup

    package mainimport ( "fmt" "sync")func say(i int ,wg *sync.WaitGroup) { defer wg ...

  10. C#Socket通讯(1)

    前言 因为自己需要开发一款自己的游戏,因为设计网络方面,所以我找了很多的资料,再加上考虑到Unity游戏客户端直接连接数据库很容易导致数据库泄露,再加上网上很多的服务端都是用控制台做的,所以我就想做个 ...