[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这条边的编号 下面 ...
随机推荐
- 关于地图首页会卡 button background惹的祸
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:sat=&q ...
- Request[""]接收的值有逗号(,)
这是因为你的前台页面有连个标签的name值相等导致的.Request["name"]其实是通过name值或得标签的value值的. 所以一般情况下name值不要相等. 需要互斥的就 ...
- DPDK skeleton basicfwd 源码阅读
学习这个例子用于理解单纯的 dpdk 转发过程,L2 和 L3 的转发是基于此:在rte_eth_rx_burst()收包后进行解包,提取 mac.ip 等信息然后在转发到输出网卡. 如果要写出自己的 ...
- Week2-作业1
第一章:引用:如果一架民用飞机上有一个功能,用户使用它的概率是百万分之一,你还要做这个功能么? 选择之后,这个功能是什么呢?谜底是飞机的安全功能. 个人认为,飞机的安全功能这个 ...
- iOS 怎么自定制推送声音呢?(APP运行时和APP进入后台时)
说明: 一般如果修改了apple官方的推送声音后,则APP进入后台后,推送会播放开发者自定制的推送声音,而用户在使用APP(也就是APP运行时)的时候,一般是不会有推送声音,因为此时的推送内容已经呈现 ...
- Alpha阶段敏捷冲刺⑤
1.提供当天站立式会议照片一张. 每个人的工作 (有work item 的ID),并将其记录在码云项目管理中: 昨天已完成的工作. 新增了一个登录界面 完成记账的分类模块 报表界面初步设计 今天要完成 ...
- ArrayList底层实现
ArrayList 底层是有数组实现,实际上存放的是对象的引用,而不是对象本身.当使用不带参的构造方法生成ArrayList对象时,实际会在底层生成一个长度为10的数组 当添加元素超过10的时候,会进 ...
- vsftpd重启失败解决方法
vsftpd dead,but subsys locked vsftpd已死,但是subsys被锁 关于VSFTPD服务器重启失败,研究了一晚上,当virtual_use_local_privs=ye ...
- java与C++相比增加和缺少的特性--持续更新
缺少的特性 java值类型中没有无符号数 java没有运算符重载语法 java中没有struct和union等用户自定义值类型 java中没有虚函数的概念,所有函数默认具有虚函数的特性 java采用单 ...
- 01 Spring Boot 的简单配置和使用
Spring Boot 简介 使用 Spring Boot 可以让我们快速创建一个基于 Spring 的项目,而让这个 Spring 项目跑起来我们只需要很少的配置就可以了. 创建 Spring Bo ...