【BZOJ】3993: [SDOI2015]星际战争
题意
\(m\)个人\(n\)个物品,第\(i\)个物品生命值为\(A_i\),第\(i\)个人每秒可以减少一个物品\(B_i\)的生命值,给出一个\(m \times n\)的矩阵,如果\(i\)行\(j\)列为\(1\),则表示第\(i\)个人可以攻击第\(j\)个物品,否则不能攻击,问至少需要多少秒,能干掉所有物品。一个物品被干掉当且仅当生命值小于等于\(0\)。(\(n, m \le 50, 1 \le A_i \le 10^5, 1 \le B_i \le 10^3\) )
分析
我们可以二分时间,然后判定。首先我们能列出一些约束,然后发现可以用上下界可行流来做。
题解
二分时间\(t\),令\(C(i, j)\)表示第\(i\)个人减少了\(j\)物品的血量,容易列出:
\]
\]
然后裸上上下界可行流即可。
(即使有\(2500\)个点....
#include <bits/stdc++.h>
using namespace std;
typedef long double lf;
const lf eps=1e-5, oo=1e150;
const int N=55, M=55, nN=3005, nM=nN*8;
inline int dcmp(lf a) {
return a>-eps?a>=eps:-1;
}
int ihead[nN], cnt, A[N], B[M], ed[M][N], n, m;
struct E {
int next, from, to;
lf cap;
}e[nM];
void add(int x, int y, lf cap) {
e[++cnt]=(E){ihead[x], x, y, cap}; ihead[x]=cnt;
e[++cnt]=(E){ihead[y], y, x, 0 }; ihead[y]=cnt;
}
lf isap(int s, int t, int n) {
static int gap[nN], cur[nN], d[nN], p[nN];
memset(gap, 0, sizeof(int)*(n+1));
memset(d, 0, sizeof(int)*(n+1));
memcpy(cur, ihead, sizeof(int)*(n+1));
gap[0]=n;
lf ret=0, f;
for(int i, x=s; d[s]<n; ) {
for(i=cur[x]; i; i=e[i].next) if(dcmp(e[i].cap)>0 && d[x]==d[e[i].to]+1) break;
if(i) {
p[e[i].to]=cur[x]=i; x=e[i].to;
if(x==t) {
for(f=oo; x!=s; x=e[p[x]].from) f=min(f, e[p[x]].cap);
for(x=t; x!=s; x=e[p[x]].from) e[p[x]].cap-=f, e[p[x]^1].cap+=f;
ret+=f;
}
}
else {
if(!--gap[d[x]]) break;
d[x]=n;
cur[x]=ihead[x];
for(i=cur[x]; i; i=e[i].next) if(dcmp(e[i].cap)>0 && d[x]>d[e[i].to]+1) d[x]=d[e[i].to]+1;
++gap[d[x]];
if(x!=s) x=e[p[x]].from;
}
}
return ret;
}
bool check(lf R) {
int in=0, all=n*m+n+m+2+2, s=n*m+n+m+1, t=s+1, S=t+1, T=S+1;
memset(ihead, 0, sizeof(int)*(all+1));
cnt=1;
for(int i=1; i<=m; ++i) {
int idi=n*m+i;
add(s, idi, R*B[i]);
for(int j=1; j<=n; ++j) {
int idj=n*m+m+j;
int id=(i-1)*n+j;
add(idi, id, oo);
if(ed[i][j]) {
add(id, idj, oo);
}
}
}
for(int i=1; i<=n; ++i) {
int id=n*m+m+i;
add(id, T, A[i]);
in+=A[i];
}
add(S, t, in);
add(t, s, oo);
lf sum=isap(S, T, all);
if(dcmp(sum-in)!=0) {
return 0;
}
return 1;
}
int main() {
scanf("%d%d", &n, &m);
for(int i=1; i<=n; ++i) {
scanf("%d", &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", &ed[i][j]);
}
}
lf l=0, r=1e6;
while(dcmp(r-l)>0) {
lf mid=(l+r)/2;
if(check(mid)) {
r=mid;
}
else {
l=mid;
}
}
printf("%.9Lf\n", r);
return 0;
}
【BZOJ】3993: [SDOI2015]星际战争的更多相关文章
- BZOJ 3993: [SDOI2015]星际战争 [二分答案 二分图]
3993: [SDOI2015]星际战争 题意:略 R1D2T1考了裸二分答案+二分图最大匹配... #include <iostream> #include <cstdio> ...
- BZOJ 3993 [SDOI2015]星际战争 | 网络流 二分答案
链接 BZOJ 3993 题解 这道题挺棵的-- 二分答案t,然后源点向武器连t * b[i], 武器向能攻击的敌人连1, 敌人向汇点连a[i],如果最大流等于所有敌人的a[i]之和则可行. #inc ...
- bzoj 3993: [SDOI2015]星际战争
#include<cstdio> #include<iostream> #include<cstdlib> #include<cstring> #def ...
- 网络流(二分):BZOJ 3993: [SDOI2015]星际战争
Description 3333年,在银河系的某星球上,X军团和Y军团正在激烈 地作战.在战斗的某一阶段,Y军团一共派遣了N个巨型机器人进攻X军团的阵地,其中第i个巨型机器人的装甲值为Ai.当一个巨型 ...
- 3993: [SDOI2015]星际战争
3993: [SDOI2015]星际战争 Time Limit: 10 Sec Memory Limit: 128 MBSec Special JudgeSubmit: 1244 Solved: ...
- bzoj千题计划131:bzoj3993: [SDOI2015]星际战争
http://www.lydsy.com/JudgeOnline/problem.php?id=3993 二分答案 源点向武器连 mid*攻击力的边 机器人向汇点连 防御力 的边 武器i能攻击机器人j ...
- bzoj3993: [SDOI2015]星际战争(网络流)
3993: [SDOI2015]星际战争 题目:传送门 题解: 洛谷AC了,但是因为bzoj的spj有问题所以暂时没A 一道老题目了,二分时间然后网络流判断. 每次st-->武器连时间*攻击力 ...
- BZOJ_3993_[SDOI2015]星际战争_二分+网络流
BZOJ_3993_[SDOI2015]星际战争_二分+网络流 Description 3333年,在银河系的某星球上,X军团和Y军团正在激烈地作战.在战斗的某一阶段,Y军团一共派遣了N个巨型机器人进 ...
- 【BZOJ3993】[SDOI2015]星际战争 二分+最大流
[BZOJ3993][SDOI2015]星际战争 Description 3333年,在银河系的某星球上,X军团和Y军团正在激烈地作战.在战斗的某一阶段,Y军团一共派遣了N个巨型机器人进攻X军团的阵地 ...
随机推荐
- 深入了解C#系列:谈谈C#中垃圾回收与内存管理机制
今天抽空来讨论一下.Net的垃圾回收与内存管理机制,也算是完成上个<WCF分布式开发必备知识>系列后的一次休息吧.以前被别人面试的时候问过我GC工作原理的问题,我现在面试新人的时候偶尔也会 ...
- thinkphp 3.2与phpexcel
thinkphp版本:3.2 1.在http://phpexcel.codeplex.com/下载最新PHPExcel 2.把Classes目录下的文件(PHPExcel.php和PHPExcel文件 ...
- thinkphp上传
上传代码 // 缩略图上传 $upload = new \Think\Upload();// 实例化上传类 $upload->maxSize = ;// 设置附件上传大小 $upload-> ...
- linux下apache各种跳转(包括伪静态)的配置
1.404跳转: vi /etc/httpd/conf/httpd.conf 在虚拟主机配置里添加一行:ErrorDocument 404 /404.html 2.301跳转: 1)将不带www的 ...
- 图解TCP、IP笔记
七层:应用层.表示层.会话层.传输层.网络层.数据链路层.物理层 应用层:与通信无关的功能 表示层:例如转换编码格式 会话层:采用哪种连接方法 传输层以下: 传输层:确立连接与断开连接重发 网络层:从 ...
- Jquery实现花瓣随机飘落(收藏自慕课网)
这个东西实际上慕课的艾伦大大先写的. 然后别人推荐给我,偶一直收藏着,然后偶再推荐给偶的队友们,然后呢,这帮货就懒得都不肯去看... 接着今天受伤在家就提出来了一点东西放在我博客顶上... 然后艾伦的 ...
- JavaScript getComputedStyle
我们使用 element.style 也可以获取元素的CSS样式声明对象,但是其与 getComputedStyle 方法还是有一些差异的. 首先,element.style 是可读可写的,而 get ...
- R语言-处理异常值或报错的三个示例
博客总目录:http://www.cnblogs.com/weibaar/p/4507801.html Tuesday, March 31, 2015 之前用rvest帮人写了一个定期抓取amazon ...
- 2014 Multi-University Training Contest 9#11
2014 Multi-University Training Contest 9#11 Killing MonstersTime Limit: 2000/1000 MS (Java/Others) ...
- XHTML的规则
以正确的DOCTYPE和命名空间开始文档 使用meta内容元素声明你的字符编码 用小写字母写所有元素和属性名称 给所有属性值加引号 给所有属性赋一个值 关闭所有标签 用空格和斜杠关闭“空”标签 不要在 ...