题目大意:

网址: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]消毒的更多相关文章

  1. [BZOJ3140][HNOI2013]消毒(二分图最小点覆盖)

    3140: [Hnoi2013]消毒 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1621  Solved: 676[Submit][Status] ...

  2. bzoj 3140: [Hnoi2013]消毒

    3140: [Hnoi2013]消毒 Description 最近在生物实验室工作的小T遇到了大麻烦. 由于实验室最近升级的缘故,他的分格实验皿是一个长方体,其尺寸为a*b*c,a.b.c 均为正整数 ...

  3. P3231 [HNOI2013]消毒

    P3231 [HNOI2013]消毒 二维覆盖我们已经很熟悉了 扩展到三维,枚举其中较小的一维,这里定义为$a$ 以$a$为关键字状压,$1$表示该面全选 剩下的面和二维覆盖一样二分图匹配 如果还没接 ...

  4. 3140:[HNOI2013]消毒 - BZOJ

    题目描述 Description 最近在生物实验室工作的小 T 遇到了大麻烦. 由于实验室最近升级的缘故,他的分格实验皿是一个长方体,其尺寸为 a*b*c,a.b.c均为正整数.为了实验的方便,它被划 ...

  5. bzoj3140: [Hnoi2013]消毒

    Description 最近在生物实验室工作的小T遇到了大麻烦. 由于实验室最近升级的缘故,他的分格实验皿是一个长方体,其尺寸为a*b*c,a.b.c 均为正整数.为了实验的方便,它被划分为a*b*c ...

  6. 【刷题】BZOJ 3140 [Hnoi2013]消毒

    Description 最近在生物实验室工作的小T遇到了大麻烦. 由于实验室最近升级的缘故,他的分格实验皿是一个长方体,其尺寸为abc,a.b.c 均为正整数.为了实验的方便,它被划分为abc个单位立 ...

  7. BZOJ3140:[HNOI2013]消毒——题解

    http://www.lydsy.com/JudgeOnline/problem.php?id=3140 https://www.luogu.org/problemnew/show/P3231 最近在 ...

  8. bzoj3140: [Hnoi2013]消毒(二分图)

    题目描述 最近在生物实验室工作的小T遇到了大麻烦. 由于实验室最近升级的缘故,他的分格实验皿是一个长方体,其尺寸为a*b*c,a.b.c 均为正整数.为了实验的方便,它被划分为a*b*c个单位立方体区 ...

  9. [luogu3231 HNOI2013] 消毒 (二分图最小点覆盖)

    传送门 Description 最近在生物实验室工作的小T遇到了大麻烦. 由于实验室最近升级的缘故,他的分格实验皿是一个长方体,其尺寸为abc,a.b.c 均为正整数.为了实验的方便,它被划分为abc ...

随机推荐

  1. CocosCreator游戏开发---菜鸟学习之路(二)SocketIO简易教程

    请先参考教程司令部-SocketIO教程进行相关操作 开发完成后部分用户会出现持续输出 a userConnected的BUG 如下图所示 经过一段时间的BUG检查终于发现了问题所在.每个人碰到的情况 ...

  2. apache 改变文档根目录www的位置

    1.找到apache的安装目录,找到config/httpd.conf,找到DocumentRoot "D:/wamp/www/" 改成你想要的目录,例如:改成 DocumentR ...

  3. shell编程之BASH变量(2)

    变量命名规范 在bash中,变量的默认类型都是字符串型,定义 name = 'kk' 变量分类 用户自定义变量.变量自定义的 环境变量:这种变量中主要保存的是和系统操作环境相关的数据.变量可以自定义, ...

  4. shell脚本实现anisble客户端脚本分发和密钥授权配置

    ##############################Deploy ansible client shell######################## echo "start d ...

  5. CENTOS/RHEL 7 系统中设置SYSTEMD SERVICE的ULIMIT资源限制

    遇到的问题: golang程序一直出现 too many open files的报错, 尽管对 /etc/security/limits.conf 做了设置, 对最大文件打开数,最大进程数做了调优. ...

  6. Git hook实现自动部署

    Git Hook 是 Git 提供的一个钩子,能被特定的事件触发后调用.其实,更通俗的讲,当你设置了 Git Hook 后,只要你的远程仓库收到一次 push 之后,Git Hook 就能帮你执行一次 ...

  7. PHP中的浮点精度和类型

    PHP中的浮点数 精度 在PHP中,浮点数的字长和平台相关,通常最大值是 1.8e308 并具有 14 位十进制数字的精度(64 位 IEEE 格式). 浮点数的精度有限.尽管取决于系统,PHP 通常 ...

  8. cookie session区别

      先理解为什么出现cookie和session: 为了使得网站可以跟踪客户端与服务器之间的交互,保存和记忆每个用户的身份和信息,我们需要一种强有力的解决方案,这样就产生了会话控制. 会话控制思想就是 ...

  9. jersey2.26+spring5+jpa一步步搭建restful服务

    前言 首先,为什么想选择Jersey做restful服务呢?我个人比较喜欢它的插件化设计,可以方便的注入自己的全局处理逻辑.再一个就是可以生成wadl描述文件,供查询服务方法.所以在学习spring的 ...

  10. Java——正则表达式

    题目: java中提供了对正则表达式的支持. 有的时候,恰当地使用正则,可以让我们的工作事半功倍! 如下代码用来检验一个四则运算式中数据项的数目,请填写划线部分缺少的代码. 注意:只填写缺少代码,不要 ...