[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这条边的编号 下面 ...
随机推荐
- 团队作业4--第一次项目冲刺2(Alpha版本)
1.会议 第二次会议: ①:总结第一天任务出现的问题 ②:安排下面两天的任务 2任务安排 3.任务分解图 4.燃尽图 5.适当的项目程序/模块的最新(运行)截图 6.心得 因为做前端的同学并不擅长这方 ...
- app token session rsp
引用:https://blog.csdn.net/jack85986370/article/details/51362278 一.登录机制 粗略地分析, 登录机制主要分为登录验证.登录保持.登出三个部 ...
- 经纬转换成point的sql
.UPDATE xx.zd_kakou_info t,(SELECT kakou_id, kakou_lon,kakou_lat,CONCAT('POINT(' , kakou_lon ,' ',ka ...
- 内网内使用https 和 使用http 建立连接的速度对比
文字版 使用https httpstat https://10.24.101.14/cwbase/web/Login.aspx --insecure Connected to HTTP/ OK Ser ...
- 【问底】王帅:深入PHP内核(一)——弱类型变量原理探究
来源:CSDN http://www.csdn.net/article/2014-09-15/2821685-exploring-of-the-php 作者:王帅 摘要:PHP作为一门简单而强大 ...
- CentOS 6.5以上版本安装mysql 5.7 完整版教程(修订版)
转载自:https://codeday.me/collect/20170524/21861.html 1: 检测系统是否自带安装mysql # yum list installed | grep my ...
- Cent7安装mysql5.7.11全过程
下载mysql(注:其他版本未测试) https://cdn.mysql.com/archives/mysql-5.7/mysql-boost-5.7.11.tar.gz 1.安装依赖包 yum -y ...
- 数据结构开发(14):KMP 子串查找算法
0.目录 1.KMP 子串查找算法 2.KMP 算法的应用 3.小结 1.KMP 子串查找算法 问题: 如何在目标字符串S中,查找是否存在子串P? 朴素解法: 朴素解法的一个优化线索: 示例: 伟大的 ...
- 关于BIO和NIO的理解
摘要: 关于BIO和NIO的理解 最近大概看了ZooKeeper和Mina的源码发现都是用Java NIO实现的,所以有必要搞清楚什么是NIO.下面是我结合网络资料自己总结的,为了节约时间图示随便画的 ...
- Linux nc命令用法收集
ps.ubuntu自带的nc是netcat-openbsd版,不带-c/-e参数. pss.在线Markdown编辑器的bug是怎么回事...“#”号依然显示着 ##参数 想要连接到某处: nc [- ...