题目链接:

https://www.luogu.org/problemnew/show/P3324

分析:

因为本题的时间较多,不能枚举,但发现有单调性,于是二分答案,二分使用的时间TTT

每个攻击装置造成的伤害总量已知,为T∗BiT*B_iT∗Bi​,现在有了伤害总量、生命总量,如何判断在TTT时间内,机器人是否被全部打死?

源点S向所有攻击装置连边,流量为T∗BiT*B_iT∗Bi​

攻击装置向能攻击到的机器人连边,流量为INF

所有机器人向汇点T连边,流量为AiA_iAi​

验证TTT时间所有机器人都能被打死 当且仅当 上图的最大流=∑Ai= \sum A_i=∑Ai​(所有机器人生命值之和)

代码:

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<vector>
#include<queue>
#define maxn 110
#define inf 0x7fffffffffffffffll
using namespace std;
int n,m,s,t,d[maxn];
long long sum,ans,Sum_A;
long long a[maxn];
long long b[maxn];
int mp[maxn][maxn];
struct edge
{
int to,rev;
long long val;
edge (int _to,long long _val,int _rev)
{
to=_to;
val=_val;
rev=_rev;
}
};
vector<edge> e[maxn];
void add(int x,int y,long long val)
{
e[x].push_back(edge(y,val,e[y].size()));
e[y].push_back(edge(x,0,e[x].size()-1));
}
bool bfs()
{
memset(d, -1, sizeof(d));
queue<int> q;
q.push(s);
d[s]=0;
while(!q.empty())
{
int x=q.front();
q.pop();
for(int i=0;i<e[x].size();i++)
{
int y=e[x][i].to;
if(d[y]==-1 && e[x][i].val)
{
q.push(y);
d[y]=d[x]+1;
}
}
}
if(d[t]==-1)
return 0;
else
return 1;
}
long long dfs(int x,long long low)
{
if(x==t||low==0)
return low;
long long totflow=0;
for(int i=0;i<e[x].size();i++)
{
int y=e[x][i].to;
int rev=e[x][i].rev;
if(d[y]==d[x]+1&&e[x][i].val)
{
long long a=dfs(y,min(low,e[x][i].val));
e[x][i].val-=a;
e[y][rev].val+=a;
low-=a;
totflow+=a;
if(low==0)
return totflow;
}
}
if(low!=0)
d[x]=-1;
return totflow;
}
bool pd(long long Time)
{
for(int i=0;i<maxn;i++)
e[i].clear();
sum=ans=0;
s=0,t=n+m+1;
for(int i=1;i<=m;i++)
add(s,i,Time*b[i]);
for(int i=1;i<=m;i++)
for(int j=1;j<=n;j++)
if(mp[i][j])
add(i,j+m,inf);
for(int j=1;j<=n;j++)
add(j+m,t,a[j]*10000);
while(bfs())
{
ans+=dfs(s,inf);
}
if(ans==Sum_A*10000)
return 1;
else
return 0;
} int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
{
scanf("%lld",&a[i]);
Sum_A+=a[i];
}
for(int i=1;i<=m;i++)
scanf("%lld",&b[i]);
for(int i=1;i<=m;i++)
for(int j=1;j<=n;j++)
scanf("%d",&mp[i][j]);
long long l=0,r=10000000000000ll;
long long an=l;
while(l<=r)
{
long long mid=(l+r)/2;
if(pd(mid))
{
an=mid;
r=mid-1;
}
else
l=mid+1;
}
printf("%.6lf\n",(double)an/(double)10000.0);
return 0;
}

洛谷P3324 [SDOI2015]星际战争 题解的更多相关文章

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

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

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

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

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

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

  4. P3324 [SDOI2015]星际战争

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

  5. Luogu P3324 [SDOI2015]星际战争

    二分+最大流 首先考虑二分答案 然后可以发现对于已知时间,判断是否可以将所有机器人摧毁可以用网络流 建立源点和汇点,源点向每一个激光武器连一条容量为$time*b[i]$的边,表示该激光武器在$tim ...

  6. bzoj3993: [SDOI2015]星际战争(网络流)

    3993: [SDOI2015]星际战争 题目:传送门 题解: 洛谷AC了,但是因为bzoj的spj有问题所以暂时没A 一道老题目了,二分时间然后网络流判断. 每次st-->武器连时间*攻击力 ...

  7. 3993: [SDOI2015]星际战争

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

  8. 【BZOJ3993】[SDOI2015]星际战争 二分+最大流

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

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

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

随机推荐

  1. Linux7下配置Nginx站点.

    今天闲来无事,把服务器重新配置了一下,作为开发者,实际上很多人都是长时间不去配置服务器的,所以曾经很多东西又忘掉了差不多. 特在此分享一下配置成功后的配置文件内容. 其实配置后的文件内容很简单,也没有 ...

  2. Tensorflow中循环神经网络及其Wrappers

    tf.nn.rnn_cell.LSTMCell 又名:tf.nn.rnn_cell.BasicLSTMCell.tf.contrib.rnn.LSTMCell 参见: tf.nn.rnn_cell.L ...

  3. C# ACCESS 修改表记录提示"UPDATE 语句语法错"问题

    错误的sql 语句如下: sqlStr =  "update tb_userInfo set passWord='" + pw + "' where userName=' ...

  4. CMake编译Widget UI Qt程序

    自从CMake被引入到KDE项目的编译系统中后,CMake的使用者日益增多,Qt也不例外,除了使用QMAKE编译Qt程序外,也可以使用CMake来编译Qt程序,并且CMake在使用上更灵活,特别是大型 ...

  5. QT中的SOCKET编程

    转自:http://mylovejsj.blog.163.com/blog/static/38673975200892010842865/ QT中的SOCKET编程 2008-10-07 23:13 ...

  6. IT安全军火库-转

    全球有260万信息安全专业人士,渗透测试工具是他们“安全军火库”中最常使用的装备,但直到最近,可用的渗透测试工具才丰富起来,但这也带来一个问题,挑选合适的渗透测试工具成了一件麻烦事,一个最简单的方法就 ...

  7. export命令的使用

    一:export将环境变量昭告天下     1.直接输入export会将显示bash下的所有环境变量       2.env/set/export/declare都可以显示shell的变量       ...

  8. scikit-learn杂记

    1.数据预处理 二值化 import numpy as np from sklearn import preprocessing X = np.array([[1., -1., 2.], [2., 0 ...

  9. Mac sublime text3 安装插件

    一.下载Mac版sublime text3 下载地址:http://www.pc6.com/mac/120663.html(参考) 2.安装后打开 1.在界面的最上端找到tools(英文版),选择第一 ...

  10. mysql数据库在linux下的导出和导入及每天的备份

    mysql数据库的导出,导入 1. 导出数据库为sql文件 mysqldump 数据库名 -uroot -p > xxx.sql 导出数据表结构和数据 eg.   mysqldump cloud ...