题目

传送门

题解

如果让所用时间最少,那么就让每个激光武器的利用率最高。
对于每一个激光,都有多种决策——花多少时间攻击哪一个机器人,而最科学地利用激光器,就可以侠侣最高。
我们采用二分的思想,二分一个时间:t,使用最大流验证是否可以打完所有的机器人;

  • S向激光器连边,容量为 t * t*b[i]);
  • 机器人向T连边,容量为a[i];
  • 可以攻击的关系连一条边,容量为inf(这里意味着让最大流自己决断)
  • 求出最大流判断是否等于 sigma(a[i])1<=i<=n

cansult说不使用double直接二分,*10000输出再 /10000.0 即可

代码

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<queue>
#define ll long long
using namespace std;
const int maxn=3000;
const int inf=1e9;ll maxflow,sum;
int n,m,a[1001],b[1001];
struct Edge{int next,to;ll dis;
}edge[maxn<<1];
int num_edge=-1,head[maxn],cur[maxn],deep[maxn];
bool mp[1001][1001]; void add_edge(int from,int to,ll dis)
{edge[++num_edge].next=head[from];edge[num_edge].dis=dis;edge[num_edge].to=to;head[from]=num_edge;
}
void add(int x,int y,ll z) {add_edge(x,y,z); add_edge(y,x,0);}
queue <int> q;
bool bfs(int s,int t)
{memset(deep,0x7f,sizeof(deep));while (!q.empty()) q.pop();for (int i=0; i<=t; i++) cur[i]=head[i];q.push(s); deep[s]=0;while (!q.empty()){int now=q.front(); q.pop();for (int i=head[now]; i!=-1; i=edge[i].next){int to=edge[i].to;if (deep[to]>inf && edge[i].dis){deep[to]=deep[now]+1;q.push(to);}}}return deep[t]<inf;
}ll dfs(int now,int t,ll limit)
{if (now==t || !limit) return limit;int flow=0,f;for (int i=cur[now]; i!=-1; i=edge[i].next){cur[now]=i; int to=edge[i].to;if (deep[to]==deep[now]+1 && (f=dfs(to,t,min(edge[i].dis,limit)))){flow+=f;limit-=f;edge[i].dis-=f;edge[i^1].dis+=f;if (!limit) break;}}return flow;
}void Dinic(int s,int t)
{maxflow=0;while (bfs(s,t))maxflow+=dfs(s,t,inf);
}bool judge(ll t)
{int S=0,T=n+m+1;num_edge=-1; memset(head,-1,sizeof(head));for (int i=1; i<=m; i++) add(S,i,t*b[i]);for (int i=1; i<=n; i++) add(i+m,T,a[i]*10000);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 i=0; i<=num_edge; i++) printf("%d: %d %d %d\n",i,edge[i^1].to,edge[i].to,edge[i].dis); exit(0);Dinic(S,T);if (maxflow==sum) return 1;else return 0;
}int main()
{scanf("%d%d",&n,&m);for (int i=1; i<=n; i++) scanf("%d",&a[i]),sum+=10000*a[i];for (int i=1; i<=m; i++) scanf("%d",&b[i]);for (int i=1; i<=m; i++)for (int j=1; j<=n; j++)scanf("%d",&mp[i][j]);ll l=1,r=1e9;while (l<r){ll mid=(l+r)>>1;if (judge(mid)) r=mid;else l=mid+1;}printf("%.4lf",r/10000.0);return 0;
}

总结

二分和最大流结合起来的思路
我为什么这么不喜欢开long long

[BZOJ3993] [SDOI2015]星际战争(最大流+二分)相关推荐

  1. BZOJ3993: [SDOI2015]星际战争

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

  2. bzoj3993: [SDOI2015]星际战争(二分+最大流)

    题目描述 3333年,在银河系的某星球上,X军团和Y军团正在激烈地作战. 在战斗的某一阶段,Y军团一共派遣了N个巨型机器人进攻X军团的阵地,其中第i个巨型机器人的装甲值为Ai.当一个巨型机器人的装甲值 ...

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

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

  4. bzoj3993 [SDOI2015]星际战争 二分答案+网络流检验

    流量分配模型. 这个题如果时间不知道的话流量是未知的,对于流量未知的网络流肯定是没法做的(没有动态借流量的网络流) 由于时间上满足连续性,就可以二分答案,然后流量确定就可以跑网络流 主要还是化静为动 ...

  5. bzoj3993 [SDOI2015]星际战争

    Description \(3333\) 年,在银河系的某星球上, X军团和Y军团正在激烈地作战.在战斗的某一阶段,Y军团一共派遣了 \(N\) 个巨型机器人进攻X军团的阵地,其中第i个巨型机器人的装 ...

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

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

  7. 【BZOJ3993】 星际战争

    Time Limit: 1000 ms   Memory Limit: 128 MB Description  3333年,在银河系的某星球上,X军团和Y军团正在激烈地作战.在战斗的某一阶段,Y军团一 ...

  8. [SDOI2015]星际战争

    题目描述 3333年,在银河系的某星球上,X军团和Y军团正在激烈地作战. 在战斗的某一阶段,Y军团一共派遣了N个巨型机器人进攻X军团的阵地,其中第i个巨型机器人的装甲值为Ai.当一个巨型机器人的装甲值 ...

  9. P3324 [SDOI2015]星际战争

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

  10. 【Luogu-P3324 [SDOI2015] / DSY-1993】星际战争

    传送门:P3324 [SDOI2015]星际战争 二分 + 最大流 Solution\mathfrak{Solution}Solution 1 不可否认,看到题面的第一反应是构造二分图,让武器在一边, ...

最新文章

  1. RecycleView分割线
  2. C#-获取页面源代码
  3. 美国的工资、俄罗斯的妻子、英国的房子、中国的饮食
  4. mysql数据库在什么上运行_mysql – 在所有数据库上运行SQL查询
  5. Linux内核热补丁方案对比
  6. C Linux 多线程入门
  7. [ZJOI2008]树的统计
  8. matlab中功率因数怎样测量,如何测量功率因数?功率因数测量方法
  9. 电信近期有充值送红包的活动
  10. Yarn HA 原理
  11. Spring的完整介绍
  12. 自定义iOS的状态栏
  13. Abaqus+Ncode振动疲劳分析视频教程
  14. 2017年社区超市电商APP开发行业的发展
  15. 联想电脑管家充电模式无法切换
  16. 如何判断一个LED节能灯的正负极
  17. Three.js资源
  18. 透明背景flash html5,DW中实现flash的透明背景
  19. 社区管理有捷径!Wish3D Earth社区网格化管理案例重磅上线
  20. 【Java基础】--05.java基本类型与包装类型

热门文章

  1. L1-7 机工士姆斯塔迪奥
  2. Qt警告:Missing reference in range-for with non trivial type (QString) [clazy-range-loop]
  3. lighttpd 之九 配置信息加载
  4. THUSC2021游记
  5. 浅谈混迹力扣和codeforces上的几个月
  6. 升级Win11必看!!
  7. 基于Java的微小企业人事管理系统的设计与实现 毕业设计-附源码231012
  8. 数据库原理及安全技术教学实验报告SQL实践(一)
  9. [转]杀毒软件的引擎
  10. 渗透测试常用工具-amap服务枚举