[HNOI2013]消毒
题目大意:
网址:https://www.luogu.org/problemnew/show/3231
大意:a×b×c的三维空间里有a×b×c个点(x,y,z),其中有些点需要被消除。
消除的方法为:每次选定一个a1×b1×c1的三维区域,然后消除这个区域内的所有点。
消除的代价\(cost = min(a1,b1,c1);\)
现在询问消除此三维空间中所有需要消除点的最小代价为多少。
数据范围:\(a*b*c<=5000\)
题目解法:
显然题目可以转化为每次选择一个平面,然后消除该平面上的所有点。
先考虑二维空间,这不是超级无敌大水题吗。
二维不就是裸的二分图最小顶点覆盖吗?不明白怎么做的去AC一下这题:poj3041-Asteroids。
三维咋办?
观察到\(a*b*c<=5000\),那么a、b、c中至少有一个是小于等于17的。
我们枚举最小的这一维是否切割,如果不切再跑最小顶点覆盖即可。
然后这题最要命的其实不是怎么做,而是怎么实现。
考虑一下建图怎么办,开个三维数组乱搞、旋转肯定是不行的。
其实可以把每一个点拆成三个坐标,然后连边(具体看代码,讲也讲不清)。
具体实现代码:
#include<bits/stdc++.h>
#define gi(x) scanf("%d",&x)
#define maxn 5005
#define INF 1e9+7
using namespace std;
int D,L[4],d,pos,g1,g2,g3,use[maxn];
struct Road{int to,next,blg;}t[2*maxn]; int head[maxn],cnt;
int mtc[maxn],vis[maxn],Ans;
void Add(int u,int v,int w){
t[++cnt] = (Road){v,head[u]}; head[u] = cnt;
t[++cnt] = (Road){u,head[v]}; head[v] = cnt;
t[cnt-1].blg = t[cnt].blg = w;
}
//建图:
void Build(){
gi(L[1]); gi(L[2]); gi(L[3]);
pos = 1; cnt = 0;
for(int i = 1; i <= 3; i ++)
if(L[ i ] < L[ pos ])pos = i;
if(pos == 1)g1 = L[1],g2 = L[2],g3 = L[3];
if(pos == 2)g1 = L[2],g2 = L[1],g3 = L[3];
if(pos == 3)g1 = L[3],g2 = L[1],g3 = L[2];
for(int i = 1; i <= g2+g3; i ++)head[i] = 0;
for(int i = 1; i <= L[1]; i ++)
for(int j = 1; j <= L[2]; j ++)
for(int k = 1; k <= L[3]; k ++){
gi(d); if(!d)continue;
if(pos == 1)Add(j , g2 + k , i );
if(pos == 2)Add(i , g2 + k , j );
if(pos == 3)Add(i , g2 + j , k );
}
return;
}
bool Hungarian(int u,int Vis){
for(int i = head[u]; i; i = t[i].next){
int v = t[i].to;
if(vis[v] != Vis && !use[t[i].blg]){
vis[v] = Vis;
if(!mtc[v] || Hungarian(mtc[v],Vis)){
mtc[v] = u; mtc[u] = v;
return true;
}
}
}return false;
}
inline int Solve(int ret){
int Res = 0;
for(int i = 1; i <= g2+g3; i ++)mtc[i] = 0;
for(int i = 1; i <= g2+g3; i ++)vis[i] = 0;
for(int i = 1; i <= g2; i ++){
if(mtc[i])continue;
if(Hungarian(i,i))Res++;
if(Res + ret >= Ans)return Res + ret;
}return Res + ret;
}
void Dfs(int nw,int ret){
if(nw == L[pos]+1){Ans = min(Ans,Solve(ret)); return;}
use[nw] = true; Dfs(nw+1,ret+1);
use[nw] = false; Dfs(nw+1,ret);
}
int main(){
gi(D);
while(D--){
Build();
Ans = INF;
Dfs(1,0); printf("%d\n",Ans);
}
return 0;
}
[HNOI2013]消毒的更多相关文章
- [BZOJ3140][HNOI2013]消毒(二分图最小点覆盖)
3140: [Hnoi2013]消毒 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1621 Solved: 676[Submit][Status] ...
- bzoj 3140: [Hnoi2013]消毒
3140: [Hnoi2013]消毒 Description 最近在生物实验室工作的小T遇到了大麻烦. 由于实验室最近升级的缘故,他的分格实验皿是一个长方体,其尺寸为a*b*c,a.b.c 均为正整数 ...
- P3231 [HNOI2013]消毒
P3231 [HNOI2013]消毒 二维覆盖我们已经很熟悉了 扩展到三维,枚举其中较小的一维,这里定义为$a$ 以$a$为关键字状压,$1$表示该面全选 剩下的面和二维覆盖一样二分图匹配 如果还没接 ...
- 3140:[HNOI2013]消毒 - BZOJ
题目描述 Description 最近在生物实验室工作的小 T 遇到了大麻烦. 由于实验室最近升级的缘故,他的分格实验皿是一个长方体,其尺寸为 a*b*c,a.b.c均为正整数.为了实验的方便,它被划 ...
- bzoj3140: [Hnoi2013]消毒
Description 最近在生物实验室工作的小T遇到了大麻烦. 由于实验室最近升级的缘故,他的分格实验皿是一个长方体,其尺寸为a*b*c,a.b.c 均为正整数.为了实验的方便,它被划分为a*b*c ...
- 【刷题】BZOJ 3140 [Hnoi2013]消毒
Description 最近在生物实验室工作的小T遇到了大麻烦. 由于实验室最近升级的缘故,他的分格实验皿是一个长方体,其尺寸为abc,a.b.c 均为正整数.为了实验的方便,它被划分为abc个单位立 ...
- BZOJ3140:[HNOI2013]消毒——题解
http://www.lydsy.com/JudgeOnline/problem.php?id=3140 https://www.luogu.org/problemnew/show/P3231 最近在 ...
- bzoj3140: [Hnoi2013]消毒(二分图)
题目描述 最近在生物实验室工作的小T遇到了大麻烦. 由于实验室最近升级的缘故,他的分格实验皿是一个长方体,其尺寸为a*b*c,a.b.c 均为正整数.为了实验的方便,它被划分为a*b*c个单位立方体区 ...
- [luogu3231 HNOI2013] 消毒 (二分图最小点覆盖)
传送门 Description 最近在生物实验室工作的小T遇到了大麻烦. 由于实验室最近升级的缘故,他的分格实验皿是一个长方体,其尺寸为abc,a.b.c 均为正整数.为了实验的方便,它被划分为abc ...
随机推荐
- nodejs和npm的安装
下载nodejs的压缩包 网址:https://nodejs.org/en/ 下载以tar.xz结尾的包例如:node-v8.9.4-linux-x64.tar.xz 上传包到制定的目录 可以用lrz ...
- 【Unity3D技术文档翻译】第1.0篇 AssetBundles
前言 "Unity圣典"是目前对官方文档翻译比较详细的,然而文档的最新更新日期是2013年,已经远远落后最新版本,参考意义有限.官方文档.脚本手册是学习Unity3D最直接有效的途 ...
- 论 Java 中的内存分配
Java内存分配主要包括以下几个区域: 1. 寄存器:我们在程序中无法控制 2. 栈:存放基本类型的数据和对象的引用,但对象本身不存放在栈中,而是存放在堆中 3. 堆:存放用new产生的数据 4. 静 ...
- chrome浏览器下JavaScript实现clipboard时无法访问剪切板解决方案
在用JavaScript实现某个简单的复制到剪切板功能的时候,会考虑一下浏览器兼容性,主要是重点在IE和FireFox,把这个两个浏览器搞定后,基本上其他浏览器也不用太操心了,Chrome也一样,没出 ...
- Java long类型和Long类型的那些事
还记得最近做了一个项目使用的是Long类型作为主键Id坑死人了,对于我们来说Long类型一样是一个包装类型,类似String类型,使用==符号进行比较的时候有时候会出现问题,建议适应equal()方法 ...
- MIPS中有关于分支指令及跳转寻址
分支指令 分支指令包含该指令,和两个操作数,以及跳转的分支地址,该地址是相对于下一条指令的相对地址 分支指令占6位 操作数1占5位 操作数2占5位 分支指令16位 例如 bne ...
- mysql存储引擎、事务
MySQL存储引擎介绍 文件系统 操作系统组织和存取数据的一种机制. 文件系统是一种软件. 文件系统类型 ext2 ext3 ext4 xfs 数据 不管使用什么文件系统,数据内容不会变化 不同 ...
- SQL2005查询死锁的表和具体的语句
查是哪个进程死锁了哪些表 select request_session_id spid,OBJECT_NAME(resource_associated_entity_id) tableName fro ...
- Java线程编程中isAlive()和join()的使用详解
一个线程如何知道另一线程已经结束?Thread类提供了回答此问题的方法. 有两种方法可以判定一个线程是否结束.第一,可以在线程中调用isAlive().这种方法由Thread定义,它的通常形式如下: ...
- 浏览器通过Scheme协议启动APP中的页面
在APP开发过程中,通过外部浏览器调起APP页面的场景也很普遍使用.下面就介绍一下通过外部H5页面唤起APP中页面的通用方法. 1.首先需要在AndroidMainifest.xml中对你要启动的那个 ...