题目描述 Description
最近在生物实验室工作的小 T 遇到了大麻烦。
由于实验室最近升级的缘故,他的分格实验皿是一个长方体,其尺寸为 a*b*c,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 的长方体区域(它由 x*y*z 个单位立方体组成)进行消毒时,只需要使用 min{x,y,z}单位的 F 试剂。F 试剂的价格不菲,这可难倒了小T。现在请你告诉他,最少要用多少单位的 F 试剂。(注:min{x,y,z}表示 x、y、z 中的最小者。)

输入描述 Input Description
输入文件第一行是一个正整数D,表示数据组数。
接下来是D组数据,每组数据开头是三个数a,b,c表示实验皿的尺寸。接下来会出现a个b行c列的用空格隔开的01矩阵,0表示对应的单位立方体不要求消毒,1表示对应的单位立方体需要消毒;例如,如果第1个01矩阵的第2行第3列为1,则表示单位立方体(1,2,3)需要被消毒。
输入保证满足a*b*c≤5000,T≤3。
输出描述 Output Description
仅包含 D 行,每行一个整数,表示对应实验皿最少要用多少单位的 F 试剂。
样例输入 Sample Input
1
4 4 4
1 0 1 1
0 0 1 1
0 0 0 0
0 0 0 0
0 0 1 1
1 0 1 1
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
1 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
1 0 0 0
样例输出 Sample Output
3
数据范围及提示 Data Size & Hint
对于区域(1,1,3)-(2,2,4)和(1,1,1)-(4,4,1)消毒,分别花费2个单位和1个单位的F试剂。

终于过了,fillchar没有一点优势啊
还是用各种for来把赋初值快一些

二维的怎么做大家都知道,就是二分图匹配,但是这是三维
怎么办呢?
!!!!强行转化成二维,枚举第三维的情况,那这需要2^k所以我们找最小的k
因为a*b*c<=5000,所以min{a,b,c}最大是17左右
然后开始枚举,但是还是很吃力所以对于把一个数组重新赋值的事最好避免

 var
f:array[..,..]of longint;
first,next,last,cover,bool:array[..]of longint;
flag,sum:array[..]of boolean;
a,b,c,tot,num,min,aug,ans,match,t,time,time2,maxa,maxb,maxc:longint; procedure swap(var x,y:longint);
var
t:longint;
begin
t:=x;
x:=y;
y:=t;
end; procedure init;
var
i,j,k,s,ai,bi,ci:longint;
begin
read(ai,bi,ci);
a:=;
b:=;
c:=;
num:=;
maxa:=;
maxb:=;
maxc:=;
for i:= to ai do
for j:= to bi do
for k:= to ci do
begin
read(s);
if s= then
begin
inc(num);
f[num,]:=i;
f[num,]:=j;
f[num,]:=k;
if i>maxa then maxa:=i;
if j>maxb then maxb:=j;
if k>maxc then maxc:=k;
end;
end;
min:=ai;
if bi<min then min:=bi;
if ci<min then min:=ci;
if (bi<=ai)and(bi<=ci) then
begin
swap(a,b);
swap(maxa,maxb);
end
else
if (ci<=ai)and(ci<=bi) then
begin
swap(a,c);
swap(maxa,maxc);
end;
fillchar(sum,sizeof(sum),false);
for i:= to num do
sum[f[i,a]]:=true;
end; function path(x:integer):boolean;
var
i:integer;
begin
i:=first[x];
while i<> do
begin
if bool[last[i]]<>time2 then
begin
bool[last[i]]:=time2;
if (cover[last[i]]=)or(path(cover[last[i]])) then
begin
cover[last[i]]:=x;
exit(true);
end;
end;
i:=next[i];
end;
exit(false);
end; procedure insert(x,y:integer);
begin
inc(tot);
last[tot]:=y;
next[tot]:=first[x];
first[x]:=tot;
end; procedure work;
var
i:integer;
begin
if aug>ans then exit;
tot:=;
match:=;
for i:= to maxb do
first[i]:=;
for i:= to maxc do
cover[i]:=;
for i:= to num do
if flag[f[i,a]] then insert(f[i,b],f[i,c]);
for i:= to maxb do
begin
inc(time2);
if path(i) then inc(match);
end;
if ans>aug+match then ans:=aug+match;
end; procedure try(x:integer);
begin
if x>min then work
else
begin
flag[x]:=true;
try(x+);
if sum[x] then
begin
flag[x]:=false;
inc(aug);
try(x+);
dec(aug);
end;
end;
end; begin
read(t);
for time:= to t do
begin
init;
ans:=;
try();
writeln(ans);
end;
end.

3140:[HNOI2013]消毒 - BZOJ的更多相关文章

  1. bzoj 3140: [Hnoi2013]消毒

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

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

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

  3. 【BZOJ】3140: [Hnoi2013]消毒

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3140 猜一发(显然)有结论:每次一定选择一个平面,即每次操作对答案的贡献都为$1$ 首先可 ...

  4. BZOJ.3140.[HNOI2013]消毒(二分图匹配 匈牙利)

    题目链接 不难想到每次一定是切一片. 如果是平面,很容易想到直接做二分图匹配.对于3维的? 可以发现min(a,b,c)的最大值只有\(\sqrt[3]{n}≈17\),我们暴力枚举这一最小值代表的是 ...

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

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

  6. P3231 [HNOI2013]消毒

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

  7. bzoj千题计划295:bzoj3140: [Hnoi2013]消毒

    http://www.lydsy.com/JudgeOnline/problem.php?id=3140 如果只有两维,那就是二分图最小点覆盖 现在是三维,但是a*b*c<=5000,说明最小的 ...

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

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

  9. bzoj3140: [Hnoi2013]消毒

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

随机推荐

  1. Jackson - Quickstart

    JSON Three Ways Jackson offers three alternative methods (one with two variants) for processing JSON ...

  2. 关于蓝牙设备与ios连接后,自动打开一个app

    How to launch an iphone app when an external accessory is either paired over BT or plugged into dock ...

  3. Java加密解密相关

    关于解释加密解密中的填充方案: http://laokaddk.blog.51cto.com/368606/461279/ 关于对称加密中的反馈模式: http://blog.csdn.net/aaa ...

  4. ASP.NET中页面加载时文本框(texbox控件)内有文字获得焦点时文字消失

    代码如下: <asp:TextBox ID="TextBox1" runat="server" Height="26px" MaxLe ...

  5. Quartz 第三课 More About Jobs & JobDetails(官方文档翻译)

    当学完第二课之后,你欣喜的发现,让jobs工作起来是还是相当简单的.虽然让jobs运行起来很简单,对于其执行的关键内容还是需要知道的.它们是IJob接口中的Execute和JobDetails. 当你 ...

  6. 老老实实学习WCF[第二篇] 配置wcf

    老老实实学WCF 第二篇 配置WCF 在上一篇中,我们在一个控制台应用程序中编写了一个简单的WCF服务并承载了它.先回顾一下服务端的代码: using System; using System.Col ...

  7. java内部类的定义原则

    /*内部类的访问规则:1,内部类可以直接访问外部类中的成员,包括私有.    之所以可以直接访问外部类中的成员,是因为内部类中持有了一个外部类的引用,格式 外部类名.this2,外部类要访问内部类,必 ...

  8. strlen() 和 strcpy()函数

    strlen() 和 strcpy()函数的区别,这两个一个是返回一个C风格字符串的长度,一个是对一个C风格字符串的拷贝,两个本来功能上是不同的,此外,他们还有一些细小的区别:strlen(" ...

  9. flex&bison 1

    .   {ECHO;}-----单独的flex使用中有效 .   { yyerror();}--------flex和bison交叉使用,即使不调用yyerror函数,也会报错的 error: syn ...

  10. [转]PHP5.5安装PHPRedis扩展

    phpredis是个人觉得最好的一个php-redis客户端,因为其提供的function与redis的命令基本一致,降低的了学习成本,同时功能也很全面. 一.linux安装方法 phpredis下载 ...