[洛谷P3444] [POI2006]ORK-Ploughing
洛谷题目链接[POI2006]ORK-Ploughing
题目描述
Byteasar, the farmer, wants to plough his rectangular field. He can begin with ploughing a slice from any of the field's edges, then he can plough a slice from any unploughed field's edges, and so on, until the whole field is ploughed. After the ploughing of every successive slice, the yet-unploughed field has a rectangular shape. Each slice has a span of 111 , and the length and width of the field are the integers nnn and mmm .
Unfortunately, Byteasar has only one puny and frail nag (horse) at his disposal for the ploughing. Once the nag starts to plough a slice, it won't stop until the slice is completely ploughed. However, if the slice is to much for the nag to bear, it will die of exhaustion, so Byteasar has to be careful. After every ploughed slice, the nag can rest and gather strength. The difficulty of certain parts of the field varies, but Byteasar is a good farmer and knows his field well, hence he knows every part's ploughing-difficulty.
Let us divide the field into m×nm\times nm×n unitary squares - these are called tiles in short.
We identify them by their coordinates (i,j)(i,j)(i,j) , for 1≤i≤m1\le i\le m1≤i≤m and 1≤j≤n1\le j\le n1≤j≤n .
Each tile has its ploughing-difficulty - a non-negative integer.
Let ti,jt_{i,j}ti,j denote the difficulty of the tile which coordinates are (i,j)(i,j)(i,j) .
For every slice, the sum of ploughing-difficulties of the tiles forming it up cannot exceed a certain constant kkk - lest the nag dies.
A difficult task awaits Byteasar: before ploughing each subsequent slice he has to decide which edge of the field he'll plough, so that the nag won't die. On the other hand, he'd like to plough as few slices as possible.
TaskWrite a programme that:
reads the numbers kkk , mmm and nnn from the input file, as well as the ploughing-difficulty coefficients, determines the best way to plough Byteasar's field, writes the result to the output file.
Byteasar想耕种他那块矩形的田,他每次能耕种矩形的一边(上下左右都行),在他每次耕完后,剩下的田也一定是矩形,每块小区域边长为 111 ,耕地的长宽分别为 mmm 和 nnn ,不幸的是Byteasar只有一匹老弱的马,从马开始耕地开始,只有当它耕完了一边才会停下休息。但有些地会非常难耕以至于马会非常的累,因此Byteasar需要特别小心。当耕完了一边之后,马可以停下来休息恢复体力。每块地耕种的难度不一,但是Byteasar都非常清楚。我们将地分成 m×nm\times nm×n 块单位矩形——我们用坐标 (i,j)(i,j)(i,j) 来定义它们。每块地都有一个整数 ti,jt_{i,j}ti,j ,来定义 (i,j)(i,j)(i,j) 的耕种难度。所以每次马耕一边地时的难度就是所有它耕种的地的难度总和,对于这匹虚弱的马而言,这个值不能超过他的体力值。Byteasar想知道在马不死掉的情况下最少需要耕多少次才能把地耕完。
输入输出格式
输入格式:
There are three positive integers in the first line of the input file: kkk , mmm and nnn ,separated by single spaces, 1≤k≤200 000 0001\le k\le 200\ 000\ 0001≤k≤200 000 000 , 1≤m,n≤20001\le m,n\le 20001≤m,n≤2000 .
In the following nnn lines there are the ploughing-difficulty coefficients.
The line no. j+1j+1j+1 contains the coefficients t1,j,t2,j...,tn,mt_{1,j},t_{2,j}...,t_{n,m}t1,j,t2,j...,tn,m , separated by single spaces, 0≤ti,j≤100 0000\le t_{i,j}\le 100\ 0000≤ti,j≤100 000 .
输出格式:
Your programme should write one integer to the output file: the minimum number of slices required to plough the field while satisfying the given conditions. Since we care for animals, we guarantee that the field can be ploughed according to the above rules. But remember, saving the nag is up to you!
输入输出样例
输入样例#1:
12 6 4
6 0 4 8 0 5
0 4 5 4 6 0
0 5 6 5 6 0
5 4 0 0 5 4
输出样例#1:
8
说明
感谢@NaVi_Awson 提供翻译
sto Navi_Awson orz
一句话题意: 一个矩形中每个位置有一个值,你的马也有一个体力值,每次可以选择当前矩形中的最上下左右四个方向耕地,前提是这一条的权值和小于等于马的体力值.问最少耕地次数.
题解: 首先假设我们不考虑体力的限制,那么最少耕地的次数就是\(min(n, m)\).也就是说,有一个贪心策略是一直按照横着取,直到取不了再按照横着取.
这个贪心策略是正确的,因为最优策略(在不考虑体力值的情况下)是只横着耕地或是只竖着耕地,而一直横着耕地直到不能横着耕地再按照竖着耕地的方法,是最接近最优策略的,所以这个贪心是没有问题的.
但是我们需要考虑这样一个问题:假设我们一直按照横着取,横着取不了了,现在要取竖的,那么我怎么知道要取左边一条还是右边的一条呢?显然这个是会影响到答案的,所以这个不能忽略掉.为了避免这样的判断导致答案不是最优,我们通过枚举竖着取的条数,每次枚举左边选取的条数不超过我枚举的值,这样就可以通过枚举-贪心的方法枚举出所有的情况计算,并通过贪心策略取得最优值.复杂度\(O(n^2)\)
#include<bits/stdc++.h>
using namespace std;
const int N=2000+5;
const int inf=2147483647;
int k, n, m, a[N][N], l[N][N], c[N][N], ans = inf;
inline int gi(){
int ans = 0, f = 1; char i = getchar();
while(i>'9' || i<'0'){ if(i == '-') f = -1; i = getchar(); }
while(i>='0' && i<='9') ans = ans*10+i-'0', i = getchar();
return ans * f;
}
inline int column_ans(int lim){
register int res = 0, lc = 1, rc = m, ul = 1, dl = n;
while(lc <= rc && ul <= dl){
res++;
if(c[dl][lc]-c[ul-1][lc] <= k){ lc++; continue; } // left -> right
if(c[dl][rc]-c[ul-1][rc] <= k){ rc--; continue; } // right -> left
if(l[ul][rc]-l[ul][lc-1] <= k && ul < lim){ ul++; continue; } // up -> down
if(l[dl][rc]-l[dl][lc-1] <= k){ dl--; continue; } // down -> up
return inf;
}
return res;
}
inline int line_ans(int lim){
register int res = 0, lc = 1, rc = m, ul = 1, dl = n;
while(lc <= rc && ul <= dl){
res++;
if(l[ul][rc]-l[ul][lc-1] <= k){ ul++; continue; } // up -> down
if(l[dl][rc]-l[dl][lc-1] <= k){ dl--; continue; } // down -> up
if(c[dl][lc]-c[ul-1][lc] <= k && lc < lim){ lc++; continue; } // left -> right
if(c[dl][rc]-c[ul-1][rc] <= k){ rc--; continue; } // right -> left
return inf;
}
return res;
}
int main(){
//freopen("ork.in", "r", stdin);
//freopen("ork.out", "w", stdout);
k = gi(), m = gi(), n = gi();
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++) a[i][j] = gi();
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++) l[i][j] = l[i][j-1]+a[i][j];
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++) c[i][j] = c[i-1][j]+a[i][j];
for(int i=1;i<=n;i++) ans = min(ans, line_ans(i));
for(int i=1;i<=m;i++) ans = min(ans, column_ans(i));
cout << ans << endl;
return 0;
}
[洛谷P3444] [POI2006]ORK-Ploughing的更多相关文章
- 洛谷P3444 [POI2006]ORK-Ploughing [枚举,贪心]
题目传送门 ork 格式难调,题面就不放了. 分析: 一道偏难的贪心和枚举题.考试的时候是弃疗了...yyb巨佬已经讲的很详细了,推荐他的博客.这里小蒟蒻就只放代码了. Code: #include& ...
- 洛谷P3434 [POI2006]KRA-The Disks(线段树)
洛谷题目传送门 \(O(n)\)的正解算法对我这个小蒟蒻真的还有点思维难度.洛谷题解里都讲得很好. 考试的时候一看到300000就直接去想各种带log的做法了,反正不怕T...... 我永远只会有最直 ...
- 洛谷P3435 [POI2006]OKR-Period of Words [KMP]
洛谷传送门,BZOJ传送门 OKR-Period of Words Description 一个串是有限个小写字符的序列,特别的,一个空序列也可以是一个串. 一个串P是串A的前缀, 当且仅当存在串B, ...
- 洛谷P3434 [POI2006]KRA-The Disks [模拟]
题目传送门 KRA 题目描述 For his birthday present little Johnny has received from his parents a new plaything ...
- 【题解】洛谷P3435 [POI2006] OKR-Periods of Words(KMP)
洛谷P3435:https://www.luogu.org/problemnew/show/P3435 思路 来自Kamijoulndex大佬的解释 先把题面转成人话: 对于给定串的每个前缀i,求最长 ...
- 洛谷 P3437 [POI2006]TET-Tetris 3D 解题报告
P3437 [POI2006]TET-Tetris 3D 题目描述 The authors of the game "Tetris" have decided to make a ...
- 洛谷P3434 [POI2006]KRA-The Disks
P3434 [POI2006]KRA-The Disks 题目描述 For his birthday present little Johnny has received from his paren ...
- 洛谷 P3434 [POI2006]KRA-The Disks
P3434 [POI2006]KRA-The Disks 题目描述 For his birthday present little Johnny has received from his paren ...
- 洛谷 P3434 [POI2006]KRA-The Disks 贪心
目录 题面 题目链接 题目描述 输入输出格式 输入格式 输出格式 输入输出样例 输出样例 输出样例 说明 思路 AC代码 题面 题目链接 P3434 [POI2006]KRA-The Disks 题目 ...
随机推荐
- BZOJ 3924 ZJOI2015 幻想乡战略游戏 树链剖分
题目链接:https://www.luogu.org/problemnew/show/P3345(bzoj权限题) 题意概述:动态维护树的上所有点到这棵树的带权重心的距离和.N,Q<=10000 ...
- POJ 1655 Balancing Act(求树的重心)
Description Consider a tree T with N (1 <= N <= 20,000) nodes numbered 1...N. Deleting any nod ...
- sql分页使用join提高性能
今天在分析系统中的分页sql时意外知道了使用join可以提高分页性能. 逻辑是join部分使用单一表,单一字段排序分页,然后join大表.
- Window Classes in Win32
探索Win32系统之窗口类(Window Classes in Win32) Kyle MarshMicrosoft Developer Network Technology GroupMSDN技术组 ...
- Windows 7中安装Solr7
最新忙里偷闲,研究一下了Lucene.Net,发现操作比较繁琐,同比相似的功能,感觉Solr比较简单,容易使用.不过由于Solr使用的是Java的环境,对于.Net开发的人员来说,还是比较陌生,搭配环 ...
- css滤镜让图片模糊
.mhblur { filter: url(blur.svg#blur); /* FireFox, Chrome, Opera */ -webkit-filter: blur(53px); /* Ch ...
- FastReport.net 常用方法
一.页面设置 情景:FastReport设计器页面默认设置为A4纸,但如果需要显示的字段过多,这时就出现了页面的大小无法满足完整显示所需内容的问题. 解决:出现这个问题后,我们可以在来到"文 ...
- bzoj4031-小Z的房间
题目 给一个\(n\*m\)的矩阵,每个点可能为"."或"*",有多少种方法把矩阵中的点全部连接起来,并且每两个点之间只有一条路径. 分析 题目所求的是一个矩阵 ...
- snmpwalk的报文检测
1.先用nc起一个监听的端口,然后看报文是不是正确的: 注:nc是一个模拟各种网络协议的东西,模拟服务器.客户端等: 2.触发告警,让他发报文: 3.用nc模拟一个服务端,启动一个udp的端口163: ...
- 【CodeChef】Palindromeness(回文树)
[CodeChef]Palindromeness(回文树) 题面 Vjudge CodeChef 中文版题面 题解 构建回文树,现在的问题就是要求出当前回文串节点的长度的一半的那个回文串所代表的节点 ...