4950: [Wf2017]Mission Improbable

Time Limit: 1 Sec  Memory Limit: 1024 MB
Submit: 122  Solved: 58
[Submit][Status][Discuss]

Description

那是春日里一个天气晴朗的好日子,你准备去见见你的老朋友Patrick,也是你之前的犯罪同伙。Patrick在编程竞赛
上豪赌输掉了一大笔钱,所以他需要再干一票。为此他需要你的帮助,虽然你已经金盆洗手了。你刚开始很不情愿,
因为你一点也不想再回到那条老路上了,但是你觉得听一下他的计划也无伤大雅。在附近的一个仓库里有一批货物,包含一些贵重的消费性部件,Patrick企图从中尽可能多地偷些东西出来。这意味着要找一条进去的路,弄晕安保人员,穿过各种各样的激光射线,你懂的,都是常见的抢劫技术。然而,仓库的核心装备了一套Patrick搞不定的安保系统。这也是他需要你帮助他的地方。这批货物被放置在一些巨大的立方体箱里,每个箱子的尺寸都是相同的。这些箱子堆放成许多整齐的堆,每个箱子可以表示成一个三维的网格。安保系统每个小时会用三台相机对这堆货物进行一次拍照,相机分别为:前置相机(front camera),侧置相机(side camera)和顶置相机(top camera)。前置相机的照片显示了每一行最高的那堆箱子的高度,侧置相机显示了每一列最高的那堆箱子的高度,顶置相机显示了每个位置是否存在一堆箱子。如果安保系统发现任何一张照片出现了变化,它会立即拉响警报。一旦 Patrick 进去了,他会确定每堆箱子的高度并且发给你。图1显示了一种网格可能的放置,以及每台相机会得到的视图。
图 1. 网格的高度值与对应的相机视图。
图 2. 洗劫后网格可能的高度值。
Patrick想尽可能多偷走一些箱子。由于他不能弄坏安保系统,他准备重新安排剩余每堆箱子的放置,使得下一次相
机取像时会得到相同的照片,从而骗过安保系统。在上面的例子中,他可以偷走九个箱子。图2显示了一种可能的剩余箱子的安置方案能使得安保系统认为与原安置情况相同。Patrick想请你帮他确定在保证能骗过安保系统的情况下他最多能偷走多少个箱子。你会帮他干完这最后一票么?

Input

第一行包含两个整数r(1≤r≤100)和c(1≤n≤100),分别表示网格的行数与列数。
接下来r行,每行包含c个整数,表示对应行上每堆立方体箱的高度(箱子的数量)。
所有的高度在0到10^9之间 (含边界) 。

Output

输出在不被发现的情况下最多能偷走多少箱子。

Sample Input

5 5
1 4 0 5 2
2 1 2 0 1
0 2 3 4 4
0 3 0 3 1
1 2 2 1 1
2 3
50 20 3
20 10 3

Sample Output

9
30

这题有毒

先把所有的箱子全部拿掉,再想办法放上去

①首先所有原本有箱子的格子上放回1个箱子

②然后每行、每列各选择任意一个格子放箱子,使得满足主视图侧视图要求

到这里就满足条件了,但显然不是最优解,因为当行最大值和列最大值相等的时候,只需要选择行列交叉的地方放箱子即可同时满足行列最大值要求,这样可以少放一堆

③那怎么办啊?考虑二分匹配,如果第x行和第y列最大值相等,且(x, y)上原本有箱子,那么x->y连一条边,求出最大匹配,最大匹配中的每一条边都可以为你剩下一堆箱子,全部减去就好了

注意最大值为0的情况!

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
#define LL long long
int m, vis[105], link[105], road[105][105], a[105][105], h[105], c[105];
int Sech(int x)
{int i;for(i=1;i<=m;i++){if(vis[i]==0 && road[x][i]){vis[i] = 1;if(link[i]==0 || Sech(link[i])){link[i] = x;return 1;}}}return 0;
}
int main(void)
{LL ans = 0;int n, i, j;scanf("%d%d", &n, &m);for(i=1;i<=n;i++){for(j=1;j<=m;j++){scanf("%d", &a[i][j]);h[i] = max(h[i], a[i][j]);c[j] = max(c[j], a[i][j]);ans += max(a[i][j]-1, 0);}}for(i=1;i<=n;i++){for(j=1;j<=m;j++){if(h[i] && h[i]==c[j] && a[i][j]!=0)road[i][j] = 1;}}for(i=1;i<=n;i++){memset(vis, 0, sizeof(vis));Sech(i);}for(i=1;i<=n;i++)ans -= max(h[i]-1, 0);for(i=1;i<=m;i++)ans -= max(c[i]-1, 0);for(i=1;i<=m;i++){if(link[i])ans += max(c[i]-1, 0);}printf("%lld\n", ans);return 0;
}

bzoj 4950: [Wf2017]Mission Improbable(二分匹配)相关推荐

  1. POJ - 2446 Chessboard 二分匹配+建图

    题目链接 题意很简单,是二分匹配的一种常见的题型,问题就在于怎样转换到二分图上来. 首先对对n*m-k正常点进行编号,然后遍历查找每一个正常点的上下左右是否能连接(就是判断另个点是否也是正常的),如果 ...

  2. poj3041--Asteroids(二分匹配)[将矩阵行列转化为边]

    题目大意,给出n*n的矩阵,其中有m个流星,一下给出每颗流星的坐标,每一次攻击可以消除一行或一列的流星,问最少攻击几次? 竟然是二分匹配!竟然是二分匹配!竟然是二分匹配!竟然是二分匹配! 建图,以行为 ...

  3. 香港大学提出OneNet:一阶段端到端目标检测网络,无需NMS!无需二分匹配!

    点击上方,选择星标或置顶,不定期资源大放送! 阅读大概需要15分钟 Follow小博主,每天更新前沿干货 本文作者:孙培泽 |  编辑:Amusi https://zhuanlan.zhihu.com ...

  4. 杭电2063--过山车(二分匹配)

    过山车 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submis ...

  5. pku 1486 求出二分匹配图中的必须边

    开始楞是没看懂意思,E文让我很纠结... 要判断一条边是否为二分图中必须边,方法如下: 1.先求出原图的任意最大匹配 2.对二分图某一边的所有点,删去其当前的匹配边.删的过程不是简单的将原图设为不连通 ...

  6. POJ1325二分匹配或者DINIC(最小路径覆盖)

    题意:        有k个任务,两个机器,第一个机器有n个模式,第二个机器有m个模式,每个任务要么在第一个机器的一个模式下工作,要么在第二个机器的一个模式下工作,机器每切换一个模式需要重启一次,两个 ...

  7. POJ2239简单二分匹配

    题意:       一周有7天,每天可以上12节课,现在给你每科课的上课时间,问你一周最多可以上几科课,一科课只要上一节就行了. 思路:       简单题目,直接二分就行了,好久没写二分匹配了,练习 ...

  8. hdu2413 二分+二分匹配

    题意:       地球和外星球大战,地球有n个飞船,外星球有m个飞船,每个飞船有自己的其实战舰和战舰增长率,星球于星球之间有距离,问你最少多少年地球可以打败外星球,每个星球最多只能和一个星球对战.. ...

  9. LibreOJ #2006. 「SCOI2015」小凸玩矩阵 二分答案+二分匹配

    #2006. 「SCOI2015」小凸玩矩阵 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: 匿名 提交提交记录统计讨论测试数据 题目描述 小 ...

最新文章

  1. windows下sqlite3的基本操作
  2. python linux命令-Python之路【第三篇】:Linux常用命令
  3. 【Android 应用开发】Android 图表绘制 achartengine 示例解析
  4. ABAP动态取得数据的方法
  5. 2.4操作系统之死锁详解(预防、避免、检测、解除)+思维导图
  6. cad小插件文字刷_文字狗最佳排版神器 小恐龙公文排版助手Office WPS插件
  7. 【图像处理基础知识】-傅里叶变换
  8. Linux网络配置之二ip、ss、网络相关配置文件
  9. 新的开始,从CSDN
  10. 【优化求解】基于matalb遗传算法求解岛屿物资补给优化问题【含Matlab源码 172期】
  11. scikit keras_使用Scikit-Learn,Scikit-Opt和Keras进行超参数优化
  12. 异常重试_面试题:如何基于 dubbo 进行服务治理、服务降级、失败重试?
  13. 0-9 倒计时 8x8 点阵 实现
  14. soap xml 转 json
  15. java-net-php-python-java交通事故档案管理系统PPT计算机毕业设计程序
  16. 毕业论文避免查重率过高技巧
  17. 读《熵减 华为活力之源》
  18. 试题 B: 顺子日期
  19. KML中的颜色表示顺序是ABGR
  20. 绿联mac网线转USB osx10.9-11.0.1

热门文章

  1. python自学行吗-有编程基础Python自学行吗?
  2. python装饰器详解-python装饰器详解
  3. python中国官网-中蟒 (中文 Python) 編程語言網站 chinesepython
  4. 学完python能做什么-学完Python后能做什么?
  5. 前端用户忘记密码,手机验证码修改密码功能
  6. c语言mpi矩阵乘法,【MPI并行程序】矩阵乘法
  7. java sort类_JAVA Collections工具类sort()排序方法
  8. MPlayer 使用手册中文版
  9. php if echo,多个?php if .. echo'..'; ?如何优化写法?
  10. python中plot不能显示标签_python 2: 解决python中的plot函数的图例legend不能显示中文问题...