BZOJ 3140 消毒(最小顶点覆盖)_weixin_34381687的博客-程序员秘密

技术标签: php  

题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=3140

 

题意:最近在生物实验室工作的小T遇到了大麻烦。 由于实验室最近升级的缘故,他的分格实验皿是一个长方体,其尺寸为a*b*c。为了实验的方便,它被划分为a*b*c个单位立方体区域,每个单位立方体尺寸为1*1*1。用(i,j,k)标识一个单位立方体,1 ≤i≤a,1≤j≤b,1≤k≤c。这个实验皿已经很久没有人用了,现在,小T被导师要求将其中一些单位立方体区域进 行消毒操作(每个区域可以被重复消毒)。而由于严格的实验要求,他被要求使用一种特定 的F试剂来进行消毒。 这种F试剂特别奇怪,每次对尺寸为x*y*z的长方体区域进行消毒时,只需要使用min(x,y,z)单位的F试剂。F试剂的价格不菲,这可难倒了小 T。现在请你告诉他,最少要用多少单位的F试剂。

 

思路:首先由于a*b*c<=5000,则min(a,b,c)最大为17。我们不妨设a最小,那么答案肯定不超过a,至少可以1*b*c这样消毒。但是这样不是最优的。我们用2^a枚举哪些使用 1*b*c来消毒的,然后剩下的用a*1*c和a*b*1的来进行消毒。那么对于某个格子(i,j,k),其要么被a*1*c要么被a*b*1来消毒,只有两种情况,因此建立二分图,求最小顶点覆盖即可。

 

#include <iostream>
#include <cstdio>
#include <string.h>
#include <algorithm>
#include <cmath>
#include <vector>
#include <queue>
#include <set>
#include <stack>
#include <string>
#include <map>
#include <ctype.h>
#include <time.h>
    
    
#define abs(x) ((x)>=0?(x):-(x))
#define i64 long long
#define u32 unsigned int
#define u64 unsigned long long
#define clr(x,y) memset(x,y,sizeof(x))
#define CLR(x) x.clear()
#define ph(x) push(x)
#define pb(x) push_back(x)
#define Len(x) x.length()
#define SZ(x) x.size()
#define PI acos(-1.0)
#define sqr(x) ((x)*(x))
#define MP(x,y) make_pair(x,y)
#define EPS 1e-6
    
    
#define FOR0(i,x) for(i=0;i<x;i++)
#define FOR1(i,x) for(i=1;i<=x;i++)
#define FOR(i,a,b) for(i=a;i<=b;i++)
#define FORL0(i,a) for(i=a;i>=0;i--)
#define FORL1(i,a) for(i=a;i>=1;i--)
#define FORL(i,a,b)for(i=a;i>=b;i--)
    
    
#define rush() int CC;for(scanf("%d",&CC);CC--;)
#define Rush(n)  while(scanf("%d",&n)!=-1)
using namespace std;
    
    
void RD(int &x){scanf("%d",&x);}
void RD(i64 &x){scanf("%lld",&x);}
void RD(u64 &x){scanf("%I64u",&x);}
void RD(u32 &x){scanf("%u",&x);}
void RD(double &x){scanf("%lf",&x);}
void RD(int &x,int &y){scanf("%d%d",&x,&y);}
void RD(i64 &x,i64 &y){scanf("%lld%lld",&x,&y);}
void RD(u32 &x,u32 &y){scanf("%u%u",&x,&y);}
void RD(double &x,double &y){scanf("%lf%lf",&x,&y);}
void RD(double &x,double &y,double &z){scanf("%lf%lf%lf",&x,&y,&z);}
void RD(int &x,int &y,int &z){scanf("%d%d%d",&x,&y,&z);}
void RD(i64 &x,i64 &y,i64 &z){scanf("%lld%lld%lld",&x,&y,&z);}
void RD(u32 &x,u32 &y,u32 &z){scanf("%u%u%u",&x,&y,&z);}
void RD(char &x){x=getchar();}
void RD(char *s){scanf("%s",s);}
void RD(string &s){cin>>s;}
    
    
void PR(int x) {printf("%d\n",x);}
void PR(int x,int y) {printf("%d %d\n",x,y);}
void PR(i64 x) {printf("%lld\n",x);}
void PR(i64 x,i64 y) {printf("%lld %lld\n",x,y);}
void PR(u32 x) {printf("%u\n",x);}
void PR(u64 x) {printf("%llu\n",x);}
void PR(double x) {printf("%.2lf\n",x);}
void PR(double x,double y) {printf("%.5lf %.5lf\n",x,y);}
void PR(char x) {printf("%c\n",x);}
void PR(char *x) {printf("%s\n",x);}
void PR(string x) {cout<<x<<endl;}

void upMin(int &x,int y) {if(x>y) x=y;}
void upMin(i64 &x,i64 y) {if(x>y) x=y;}
void upMin(double &x,double y) {if(x>y) x=y;}
void upMax(int &x,int y) {if(x<y) x=y;}
void upMax(i64 &x,i64 y) {if(x<y) x=y;}
void upMax(double &x,double y) {if(x<y) x=y;}
    
const int mod=1000000007;
const i64 inf=((i64)1)<<60;
const double dinf=1000000000000000000.0;
const int INF=100000000;
const int N=5005;

struct node
{
    int x,y,next;
};

node edges[N];
int head[N],e;

int n,m,r;
int K;
int X,Y;

void Add(int x,int y,int z)
{
    if(n<=m&&n<=r) 
    {
        edges[e].x=y;
        edges[e].y=z;
        edges[e].next=head[x];
        head[x]=e++;
    }
    else if(m<=n&&m<=r)
    {
        edges[e].x=x;
        edges[e].y=z;
        edges[e].next=head[y];
        head[y]=e++;
    }
    else
    {
        edges[e].x=x;
        edges[e].y=y;
        edges[e].next=head[z];
        head[z]=e++;
    }
}

int get()
{
    char c=getchar();
    while(!isdigit(c)) c=getchar();
    return c-'0';
}

struct Node
{
    int v,next;
};

Node edges1[N<<4];
int head1[N],e1;

void add(int u,int v)
{
    edges1[e1].v=v;
    edges1[e1].next=head1[u];
    head1[u]=e1++;
}

void build(int u)
{
    int i,x,y;
    for(i=head[u];i!=-1;i=edges[i].next)
    {
        x=edges[i].x;
        y=edges[i].y;
        add(x,y);
    }
}

int visit[N],XX;
int match[N];

int DFS(int u)
{
    int i,v;
    for(i=head1[u];i!=-1;i=edges1[i].next)
    {
        v=edges1[i].v;
        if(XX!=visit[v])
        {
            visit[v]=XX;
            if(match[v]==-1||DFS(match[v]))
            {
                match[v]=u;
                return 1;
            }
        }
    }
    return 0;
}

int Match()
{
    int ans=0,i;
    FOR0(i,Y) match[i]=-1;
    FOR0(i,X)
    {
        XX++;
        if(DFS(i)) ans++;
    }
    return ans;
}

int cal(int st)
{
    int ans=0,i;
    for(i=0;i<X;i++) head1[i]=-1;
    e1=0;
    FOR0(i,K) 
    {
        if(st&(1<<i)) ans++;
        else build(i);
    }
    return ans+Match();
}

int main()
{
    rush()
    {
        clr(head,-1); e=0; RD(n,m,r);
        int i,j,k;
        FOR0(i,n) FOR0(j,m) FOR0(k,r)
        {
            if(get()) Add(i,j,k);
        }
        if(n<=m&&n<=r) K=n,X=m,Y=r;
        else if(m<=n&&m<=r) K=m,X=n,Y=r;
        else K=r,X=n,Y=m;
        int ans=INF;
        FOR0(i,(1<<K)) upMin(ans,cal(i));
        PR(ans);
    }
}

 

  

 

 

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_34381687/article/details/86059616

智能推荐

备战第十二届蓝桥杯电子类《EDA设计与开发》国赛_蓝桥杯eda设计与开发试题_遗忘丶的博客-程序员秘密

目录一、规则简介1.1比赛时长1.2题目形式1.2.1客观题(30分)1.2.2设计试题(70分)1.3所用主要软件1.4考察主要知识二、 十二届省赛设计试题真题三、训练建议# 前言距离蓝桥杯国赛还有两天,这里对自己这几天零零散散的学习做一个小记录,不足之处还望指正,主要希望对以后想参加EDA项目的同学有所帮助。一、规则简介1.1比赛时长EDA项目的比赛时间是5小时,与其他电子类项目相同。以博主省赛的经验来看,比赛时最耗时间的步骤是画PCB,当时大概画了3个多小时的pcb,可能也是本人实力有

前端汇总文章之一_零一三南宫南的博客-程序员秘密

送给前端的你,推荐几篇前端汇总文章。昨天写的文章,一大早发出去点开预览的时候发现格式都错乱了。又急着去上班就把文章给删除了。本来是周一更的习惯也就打破,放到周二去更新了。今天周二,度过了烦人的周一,又开始一个新的工作日。这篇文章起初是想做:有哪些适合新手练手的前端项目?但是我发现我一个人没法整理,于是正在邀请几位大大朋友在帮忙。所以这个主题暂时空缺一周或是两周,在下周或是下下周的时候可能会补上...

个人学习笔记:在Anaconda 里搭建GEE环境和常见问题总结_小能苗我的天菜的博客-程序员秘密

小白一个QAQ大佬勿喷,为了毕业设计开始学习GEE,写这篇文主要是记录自己在anaconda里面搭建GEE环境的过程,以后遇到问题也方便查询windows系统,用的anaconda3。1.安装anaconda,有很多博客都有写就不废话了2.更换源,我用的是清华源,这类文章和解答也比较好找。比较好用的方法是,prompt里面输入:conda config --set show_channel_urls yes生成.condac文件,在文件夹里面找到它,用记事本格式打开,把...

手把手教你使用Python轻松搞定发邮件_Python进阶者的博客-程序员秘密

击上方“Python爬虫与数据挖掘”,进行关注回复“书籍”即可获赠Python从入门到进阶共10本电子书今日鸡汤自言本是京城女,家在虾蟆陵下住。前言现在生活节奏加快,人们之间交流...

基于winpcap抓包时, 出现问题的函数pcap_loop(adhandle,3,tcp_scan_packet_callback,NULL);_pcaploop adhandle_little_angel的博客-程序员秘密

基于winpcap抓包时, 出现问题的函数是://首先是循环捕获数据包pcap_loop(adhandle,3,tcp_scan_packet_callback,NULL); //然后利用回调函数进行处理void COs_detectionDlg::tcp_scan_packet_callback(unsigned char *argument,const struct pca

DWZ的Ajax表单_大z小z的博客-程序员秘密

 Ajax表单Ajax表单相关的操作封装在dwz.ajax.js中。表单查询、分页、表单提交js方法都已经封装在里面了。开发人员自己不需写js,按标准使用就可以了。表单查询DWZ中定义表单查询和分页都是用这个pagerForm来临时存查询条件。所以需要在查询页面上放下面的form&amp;lt;form id=&quot;pagerForm&quot; action=&quot;xxx&quot; method=&quot;post&quot;&amp;gt;      ...

随便推点

微软亚洲研究院面试题_曹纪乾的博客-程序员秘密

1.进程和线程的差别。   线程是指进程内的一个执行单元,也是进程内的可调度实体.   与进程的区别:   (1)调度:线程作为调度和分配的基本单位,进程作为拥有资源的基本单位   (2)并发性:不仅进程之间可以并发执行,同一个进程的多个线程之间也可并发执行   (3)拥有资源:进程是拥有资源的一个独立单位,线程不拥有系统资源,但可以访问隶属于进程的资源.   (4)系统开销:在创建或撤消进程时,

PADSLogic中库无法显示原理图原因_pads怎么有封装但没有显示出来_New_Joker的博客-程序员秘密

在我们PADS中第一次导入库时,是可以显示原理图封装图片的,但是有一次突然所有的都显示不出来了,不知道为啥,。如图所示:往往不知道为啥。其实很大一部分原因在于PADS中的Laout库被你调整过 ,如果你做过以下操作,就把原理图库中的封装弄没了,如图:左边的为原理图封装,你在Laout中导入PCB封装的时候全选了原理图封装,其实在Laout中是没有原理图封装的 所以你全选了以后就覆盖了原理图...

WEP/WPA/WPA2/WPA3初识_wpa2 wpa3_二十岁了还没有去过星巴克的博客-程序员秘密

今天来探究一下WiFi的几种加密方式。从最简单的WEP开始。WEP(Wired Equivalent Privacy,有线等效保密)WEP加密是最早在无线加密中使用的技术,新的升级程序在设置上和以前有点不同,功能当然比之前丰富一些,下面让我们来看看如何使用WEP。 当在无线“基本设置”里面“安全认证类型”选择“自动选择”、“开放系统”、“共享密钥”这三项的时候,使用的就是WEP加密技术,“自动...

经典神经网络实验篇_若向人间借回眸的博客-程序员秘密

经典神经网络实验整理lenet5模型实现手写体数字识别本次实验通过lenet5模型和MNIST数据集实现手写体数字识别训练。MNIST数据集是一个手写数字的数据库,对于卷积神经网络是一个最为简单的图片数据集。MNIST的下载地址为 http://yann.lecun.com/exdb/mnist/该数据集包含四个文件,分别为测试图像,测试标签,训练图像和训练标签。MNIST数据集图片的像素皆为28*28,单通道。标签为1-10,对应的是0-9十个数字。对于MNIST数据集,TensorFlo

【Java从0到架构师】分布式框架通信核心基础 - 序列化(JDK、Protobuf)、远程过程调用 RMI_萌宅鹿同学的博客-程序员秘密

分布式框架通信核心基础序列化JDK 的序列化Protobuf 序列化Protobuf 环境搭建与操作Protobuf 原理分析Java 从 0 到架构师目录:【Java从0到架构师】学习记录序列化在 JVM 创建的对象是在内存当中的,当 JVM 停止运行,释放内存以后,JVM 内存中的对象也会被销毁。但是在有些场景下,我们需要把对象的数据持久化保存起来,就需要使用对应的序列化和反序列化技术。序列化:把内存中的对象信息转化为字节数组的过程序列化的目的:数据持久化,数据的网络传输反序列化:序列

layui-table多级表头-数据和表头错位问题_layui多级表头数据错位_年轻没有失败จุ๊บ的博客-程序员秘密

如果colspan=1的时候会导致错位 /** * 初始化表格的列 */ ServCustmanagerKp.initColumn = function () { return [[ {type: 'checkbox',fixed: 'left',rowspan:'3'}, {type: 'numbers',title: '序号',fixed: 'left',rowspan:'3'}, {f

推荐文章

热门文章

相关标签