P3324 [SDOI2015]星际战争

转洛谷网站




题解

重难点依然是建图
考虑攻击力限制条件
一个是攻击装置能够发射的伤害
一个是防御装置能够承受的伤害
建立超级源点超级汇点
源点向武器建边,边权为攻击参数
防御向汇点建边,边权为防御系数
武器与防御之间边权infinf即可
考虑二分答案
加入现在拥有一个攻击时间
那么每个武器的输出变成原来的攻击力 * 攻击时间
此时对全图跑最大流
如果最大流和防御系数之和相等
证明当前时间可以摧毁所有防御机器人
那么就可以缩小答案规模
反之当前输出不够摧毁所有机器人
那么增加答案使输出更接近防御系数之和
考虑精度问题
可以给所有防御系数乘上10000(因为精度限制只有1000)
攻击参数不动
这样跑出来的攻击时间会比原来大10000倍
再将答案除以10000输出即可

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <queue>
#include <cmath>
#define int long long
#define min(a, b) ({register int aa = a, bb = b; aa > bb ? bb : aa;})
#define inf 0x7fffffff
using namespace std;//c的读入优化
inline int read(){int x = 0, w = 1;char ch = getchar();for(; ch > '9' || ch < '0'; ch = getchar()) if(ch == '-') w = -1;for(; ch >= '0' && ch <= '9'; ch = getchar()) x = x * 10 + ch - '0';return x * w;
}const int ss = 10010;struct node{int to, nxt, w;
}edge[ss * 20];int head[ss], tot = 1;
inline void add(register int u, register int v, register int w){edge[++tot].to = v;edge[tot].nxt = head[u];edge[tot].w = w;head[u] = tot;
}int dis[ss], cur[ss];
int n, m, s, t;
bool vis[ss];
queue<int> q;
inline bool spfa(register int s){for(register int i = 0; i <= t; i++)dis[i] = 0x3f3f3f3f, cur[i] = head[i], vis[i] = 0;dis[s] = 0;q.push(s);while(!q.empty()){register int u = q.front();q.pop();vis[u] = 0;for(register int i = head[u]; i; i = edge[i].nxt){register int v = edge[i].to;if(dis[v] > dis[u] + 1 && edge[i].w){dis[v] = dis[u] + 1;if(!vis[v]) q.push(v), vis[v] = 1;}}}return dis[t] != 0x3f3f3f3f;
}inline int dfs(register int u, register int flow){register int res = 0;if(u == t) return flow;for(register int i = cur[u]; i; i = edge[i].nxt){cur[u] = i;register int v = edge[i].to;if(dis[v] == dis[u] + 1 && edge[i].w){if(res = dfs(v, min(flow, edge[i].w))){edge[i].w -= res;edge[i ^ 1].w += res;return res;}}}return 0;
}inline long long dinic(){register long long maxflow = 0;register long long minflow = 0;while(spfa(s)){while(minflow = dfs(s, 0x7fffffff))maxflow += minflow;}return maxflow;
}long long a[ss], b[ss], sum;
bool map[55][55];
inline bool check(register long long x){for(register int j = 1; j <= m; j++)b[j] *= x;memset(head, 0, sizeof head);memset(cur, 0, sizeof cur);tot = 1;for(register int i = 1; i <= m; i++)add(s, i, b[i]), add(i, s, 0);for(register int j = 1; j <= n; j++)add(j + m, t, a[j]), add(t, j + m, 0);for(register int j = 1; j <= m; j++){for(register int i = 1; i <= n; i++){register bool op = map[j][i];if(op == 1){add(j, i + m, inf);add(i + m, j, 0);}else continue;}}register long long tmp = dinic();register bool flag = 1;if(tmp >= sum) flag = 1;else flag = 0;for(register int j = 1; j <= m; j++)b[j] /= x;return flag;
}signed main(){//读入数据n = read(), m = read();s = 0, t = n + m + 1;for(register int i = 1; i <= n; i++) a[i] = read() * 10000, sum += a[i];for(register int j = 1; j <= m; j++) b[j] = read();for(register int j = 1; j <= m; j++)for(register int i = 1; i <= n; i++)map[j][i] = read();
//二分            register long long l = 0, r = 1e9;while(l <= r){register long long mid = l + r >> 1;if(check(mid)) r = mid - 1;else l = mid + 1;}printf("%.6lf\n", (double)l / 10000);return 0;
}

P3324 [SDOI2015]星际战争(洛谷刷题记录)相关推荐

  1. 洛谷刷题记录(入门第一题)

    大家好,先自我介绍一下.我是sjksndnfkwks,目前大一学生,数据科学学院,从今天也就是2022年12月26日开始记录自己洛谷刷题的过程.目前为止我接触过java.python两种编程语言,所以 ...

  2. 洛谷刷题记录(python)【入门6】函数与结构体

    [入门6]函数与结构体https://www.luogu.com.cn/training/105#problems P5735 [深基7.例1]距离函数 import mathdef solve(a, ...

  3. 洛谷刷题记录(python)【入门3】循环结构

    [入门3]循环结构https://www.luogu.com.cn/training/102#problemsP5718 [深基4.例2]找最小值 n = int(input()) a = [int( ...

  4. 洛谷刷题C语言:数字反转、再分肥皂水、三角形面积、Apples Prologue/苹果和虫子、数的性质

    记录洛谷刷题QAQ,一些不大优雅的代码 一.[深基2.例7]数字反转 题目描述 输入一个不小于 100100100 且小于 100010001000,同时包括小数点后一位的一个浮点数,例如 123.4 ...

  5. 洛谷刷题C语言:Even? Odd? G、The Robot Plow G、pb的游戏(1)、询问学号、cover

    记录洛谷刷题QAQ 一.[USACO09OCT]Even? Odd? G 题目描述 Bessie's cruel second grade teacher has assigned a list of ...

  6. 洛谷刷题:小玉家的电费、小玉在游泳、小鱼的航程(改进版)、小鱼的游泳时间、小鱼会有危险吗

    记录洛谷刷题QAQ 一.小玉家的电费 题目描述 夏天到了,各家各户的用电量都增加了许多,相应的电费也交的更多了.小玉家今天收到了一份电费通知单.小玉看到上面写:据闽价电 [2006]27 号规定,月用 ...

  7. 洛谷刷题C语言:闰年判断、Apples、洛谷团队系统、肥胖问题、三位数排序

    记录洛谷刷题QAQ 一.[深基3.例3]闰年判断 题目描述 输入一个年份,判断这一年是否是闰年,如果是输出 111,否则输出 000. 输入格式 输入一个正整数 nnn,表示年份. 输出格式 输出一行 ...

  8. 洛谷刷题C语言:距离函数、闰年展示、计算阶乘、猴子吃桃、培训

    记录洛谷刷题QAQ 一.[深基7.例1]距离函数 题目描述 给出平面坐标上不在一条直线上三个点坐标 (x1,y1),(x2,y2),(x3,y3)(x_1,y_1),(x_2,y_2),(x_3,y_ ...

  9. 洛谷刷题C语言:潇湘の雨、分糖果、Addition、Ljeto、TRI

    记录洛谷刷题C语言QAQ 「PMOI-0」潇湘の雨 题目背景 (原 LZOI-1,改名已经 PMOI 成员同意) lhm-01 题目描述 言琢დ 在一个 2n×2n2n \times 2n2n×2n ...

  10. 洛谷刷题C语言:Bold、饱食、公平の意、DOM、

    记录洛谷刷题C语言qaq [COCI2020-2021#6] Bold 题目描述 Paula 给 Daniel 写了一封信,她需要加粗文本的字体,以便视力恶化的 Daniel 阅读. 信可以用 . 和 ...

最新文章

  1. 各种大型网站技术架构
  2. mysql lisensce_Linux之lldptool命令
  3. centos7点击桌面图标无反应_【问题帖】电脑不显示桌面图标和任务栏,只显示鼠标光标咋办?...
  4. Jzzhu and Chocolate(CF-449A)
  5. node 后台文章编辑器_我如何使用Node从报纸网站上刮掉7000篇文章
  6. 【转】c语言位域操作—_结构体内冒号:的使用
  7. 网络工程师的机会在哪里
  8. php如何输入错误返回,php – 从函数返回“错误”的最佳做法
  9. 备课手记:把Ken Olsen换成姚明
  10. ITIL4认证测试题及答案(收藏学习)
  11. 如何使用EasyNVR+CDN突破萤石云在直播客户端数量上的限制,做到低成本高性价比的直播
  12. 计算机工作招聘要求高吗,太原高中计算机教师招聘
  13. Openpose 配置pose,pose+ face,pose+face+hand的方法
  14. Java笔试/面试题
  15. js实现点击图片在屏幕中放大
  16. android摇一摇功能实现
  17. 自动化提升系列:在白色背景上拍摄白色产品
  18. (附源码)ssm大学校园慈善拍卖网站的设计与实现 毕业设计250910
  19. Coursera华盛顿大学机器学习课程总结
  20. 在移动端页面进行调试

热门文章

  1. 画象棋棋盘c语言程序设计,绘制中国象棋棋盘(c语言).docx
  2. 基本类型偏执-平行继承体系-令人着迷的暂时值域
  3. java调用ip138接口查询ip地址,iP查询接口Javascript代码示例 iP地址查询接口Javascript代码示例 iP138查询网...
  4. shiro的认证过程
  5. BM3D算法相关笔记
  6. 《码农翻身》各章节阅读连接
  7. 庸者挣扎泥潭,高手从不恋战
  8. 区块链对人工智能的变革:去中心化将带来数据新范式
  9. 称重管理系统方案之车牌识别摄像机的应用
  10. java实现屏幕亮度调节