[HNOI 2013]切糕
COGS 2398. [HNOI 2013]切糕
http://www.cogs.pro/cogs/problem/problem.php?pid=2398
★★★☆ 输入文件:nutcake.in 输出文件:nutcake.out 简单对比
时间限制:5 s 内存限制:512 MB
[HNOI 2013]切糕
第三题:切糕(程序文件名:cake.exe)100 分,运行时限:5s
经过千辛万苦小A 得到了一块切糕,切糕的形状是长方体,小A 打算拦腰将切糕切成两半分给小B。出于美观考虑,小A 希望切面能尽量光滑且和谐。于是她找到你,希望你能帮她找出最好的切割方案。
出于简便考虑,我们将切糕视作一个长P、宽Q、高R 的长方体点阵。我们将位于第z层中第x 行、第y 列上(1≤x≤P, 1≤y≤Q, 1≤z≤R)的点称为(x,y,z),它有一个非负的不和谐值v(x,y,z)。一个合法的切面满足以下两个条件:
1. 与每个纵轴(一共有P*Q 个纵轴)有且仅有一个交点。即切面是一个函数f(x,y),对于所有1≤x≤P, 1≤y≤Q,我们需指定一个切割点f(x,y),且1≤f(x,y)≤R。
2. 切面需要满足一定的光滑性要求,即相邻纵轴上的切割点不能相距太远。对于所有的1≤x,x’≤P 和1≤y,y’ ≤Q,若|x-x’|+|y-y’|=1,则|f(x,y)-f(x’,y’)| ≤D,其中D 是给定的一个非负整数。
可能有许多切面f 满足上面的条件,小A 希望找出总的切割点上的不和谐值最小的那个,即v(x, y, f (x, y))x,y 最小。
【输入格式】(input.txt)
从文件input.txt中读入数据,输入文件第一行是三个正整数P,Q,R,表示切糕的长P、宽Q、高R。第二行有一个非负整数D,表示光滑性要求。接下来是R个P行Q列的矩阵,第z个矩阵的第x行第y列是v(x,y,z) (1≤x≤P,1≤y≤Q, 1≤z≤R)。
100%的数据满足P,Q,R≤40,0≤D≤R,且给出的所有的不和谐值不超过1000。
【输出格式】(output.txt)
输出文件output.txt 仅包含一个整数,表示在合法基础上最小的总不和谐值。
【输入输出样例】
input.txt output.txt
2 2 2 6
1
6 1
6 1
2 6
2 6
input.txt output.txt
2 2 2 12
0
5 1
5 1
2 5
2 5
【样例解释】
第一组样例中最佳切面的f为f(1,1)=f(2,1)=2,f(1,2)=f(2,2)=1。
第二组样例中最佳切面的f为f(1,1)=f(2,1)=f(1,2)=f(2,2)=1。
最小割
让图来说话(画得有点儿丑、大佬勿喷)

#include<cstdio>
#include<queue>
#define N 70000
#define M 12*N
#define inf 1e9
using namespace std;
int p,q,r,d;
int f[][][];
int dx[]={-,,,};
int dy[]={,,,-};
int tot=,ans;
int src,dec;
int front[N],nextt[M],to[M],cap[M],cnt[M],lev[N];
queue<int>qq;
void insert(int u,int v,int w)
{
to[++tot]=v;cap[tot]=w;nextt[tot]=front[u];front[u]=tot;
to[++tot]=u;cap[tot]=;nextt[tot]=front[v];front[v]=tot;
}
bool bfs()
{
for(int i=;i<=dec;i++) {cnt[i]=front[i];lev[i]=-;}
while(!qq.empty()) qq.pop();
qq.push(src);lev[src]=;
while(!qq.empty())
{
int now=qq.front();qq.pop();
for(int i=front[now];i!=;i=nextt[i])
{
int t=to[i];
if(cap[i]>&&lev[t]==-)
{
qq.push(t);
lev[t]=lev[now]+;
if(t==dec) return true;
}
}
}
return false;
}
int dinic(int now,int flow)
{
if(now==dec) return flow;
int delta,rest=;
for(int & i=cnt[now];i!=;i=nextt[i])
{
int t=to[i];
if(lev[t]==lev[now]+&&cap[i]>)
{
delta=dinic(t,min(cap[i],flow-rest));
if(delta)
{
cap[i]-=delta;cap[i^]+=delta;
rest+=delta;if(rest==flow) break;
}
}
}
if(rest!=flow) lev[now]=-;
return rest;
}
int change(int x,int y,int z)
{
if(!z) return ;
return (z-)*p*q+(x-)*q+y;
}
void build()
{
for(int i=;i<=p;i++)
for(int j=;j<=q;j++)
{
for(int k=;k<=r;k++)
{
insert(change(i,j,k-),change(i,j,k),f[i][j][k]);
if(k>d)
{
for(int l=;l<;l++)
{
int nx=i+dx[l],ny=j+dy[l];
if(nx>=&&nx<=p&&ny>=&&ny<=q)
insert(change(i,j,k),change(nx,ny,k-d),inf);
}
}
}
insert(change(i,j,r),dec,inf);
}
}
int main()
{
freopen("nutcake.in","r",stdin);
freopen("nutcake.out","w",stdout);
scanf("%d%d%d%d",&p,&q,&r,&d);
dec=p*q*r+;
for(int i=;i<=r;i++)
for(int j=;j<=p;j++)
for(int k=;k<=q;k++)
scanf("%d",&f[j][k][i]);
build();
while(bfs()) ans+=dinic(src,inf);
printf("%d",ans);
}
[HNOI 2013]切糕的更多相关文章
- 图论(网络流):[HNOI 2013]切糕
[HNOI 2013]切糕 第三题:切糕(程序文件名:cake.exe)100 分,运行时限:5s 经过千辛万苦小A 得到了一块切糕,切糕的形状是长方体,小A 打算拦腰将切糕切成两半分给小B.出于美观 ...
- [BZOJ 3144][HNOI 2013] 切糕
题目大意 切糕是 (p times q times r) 的长方体,每个点有一个违和感 (v_{x, y, z}).先要水平切开切糕(即对于每个纵轴,切面与其有且只有一个交点),要求水平上相邻两点的切 ...
- [HNOI 2013] 旅行 (数学)
感觉此题难啊,数学还是太渣了,看了半天的题解才算明白了点儿. 题目大意 给一个长度为n且仅由1和-1组成的序列ai, i = 1, 2, ..., n,每个位置都有另一个值vi,要求用某种方案将序列划 ...
- [HNOI 2013] 消毒 (搜索,二分图匹配)
题目大意 一个a * b * c(a * b * c <= 5000)大小的长方体中有一些点需要被覆盖,每次可以选择任意大小的长方体,覆盖其中的点,产生的代价为这个长方体长宽高中最小的那个的长度 ...
- [HNOI 2013]数列
Description 题库链接 给你四个数 \(N,K,M,P\) ,让你生成一段长度为 \(K\) 严格单调递增序列,并且满足: 第一位可以为任意元素: 相邻两位的差值不超过 \(M\) : 序列 ...
- [HNOI 2013]游走
Description 题库链接 一个无向连通图,顶点从 \(1\) 编号到 \(N\) ,边从 \(1\) 编号到 \(M\) . 小Z在该图上进行随机游走,初始时小Z在 \(1\) 号顶点,每一步 ...
- [HNOI 2013]比赛
Description 沫沫非常喜欢看足球赛,但因为沉迷于射箭游戏,错过了最近的一次足球联赛.此次联 赛共N支球队参加,比赛规则如下: (1) 每两支球队之间踢一场比赛. (2) 若平局,两支球队各得 ...
- 解题:HNOI 2013 Cards
题面 除了不洗牌以外,每种洗牌方式的每个循环里的颜色必须一样,然后大力背包一下就好了.最后记得把不洗牌的方案也算进去 #include<cstdio> #include<cstrin ...
- 「HNOI 2013」游走
题目链接 戳我 \(Solution\) 首先申明几个变量: f[x]:到点x的概率, vis[x]:x点的度 dp[x][y]:(x,y)这条边的概率 number[x][y]:x这条边的编号 下面 ...
随机推荐
- 项目Beta冲刺(团队)第三天
1.昨天的困难 记住密码打勾之后点击登录记住密码这四个字会变成省略号 点赞点击以后本应该呈现的爱心形状变成了方块 2.今天解决的进度 成员 进度 陈家权 私信模块探索ing,回复详情界面设计 赖晓连 ...
- java中注解的使用与实例
1.spring中的一段代码: @Target(ElementType.PARAMETER)@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @ ...
- Beta阶段DAY3
一.提供当天站立式会议照片一张 二.每个人的工作 1.讨论项目每个成员的昨天进展 刘阳航:尝试改进UI,美化界面. 林庭亦:调整难度设置. 郑子熙:尝试改进UI,美化界面. 陈文俊:调整难度设置. 2 ...
- PAT 甲级 1142 Maximal Clique
https://pintia.cn/problem-sets/994805342720868352/problems/994805343979159552 A clique is a subset o ...
- DB2 数据库常用操作【持续更新】
好久没写博客了. 上次还是两个月前. 1. 连接数据库 db2 connect to dbName user userName using password 2. 查看表结构 db2 "de ...
- python利用unittest测试框架组织测试用例的5种方法
利用unittest测试框架可以编写测试用例,执行方式分两大类:利用main方法和利用testsuite,其中利用测试套件来组织测试用例可以有4种写法. 在此之前,先了解几个概念 TestCase:所 ...
- Zookeeper的基础
认识Zookeeper zookeeper是什么 分布式数据的一致性解决方案. Zookeeper 能做什么 数据发布和订阅(配置中心,config,disconf,diamond,appollo) ...
- cookie属性和作用
面试面到了cookie,自己只是还是有一点欠缺,找到一篇文章,学习一下 在chrome控制台中的resources选项卡中可以看到cookie的信息. 现在的chrome控制台已经更新了,所以要到Ap ...
- MT【163】运动是相对的
如图,在平面直角坐标系中,$P(6,8)$,四边形$ABCD$为矩形,$AB=16$,$AD=9$,点$A,B$分别在射线$OP$和$Ox$上,求$OD$的最大值_______ ...
- MT【145】不变的平面角
(2018,4月学考数学选择最后一题)如图,设矩形$ABCD$所在平面与梯形$ACEF$所在平面相交于$AC$. 若$AB=1,BC=\sqrt{3},AF=EF=EC=1,$则下面二面角的平面角为定 ...