P3444 [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!
输入输出样例
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
8
说明
感谢@NaVi_Awson 提供翻译
Solution:
大鸡哥翻译题,贼有意思。
本题一眼的不可做,连随机化都没有去打。
正解非常神奇的贪心。
首先可以确定的是答案的范围:$min(n,m)\leq ans\leq n+m$(显然的)。
然后我们可以对纵列贪心,即尽可能的删两边的纵列,不行时再删最上和最下两行,至于上下两行被删的顺序,我们可以设定一个阀值$p,\; p\in[1,n]$,表示上层删的行数不超过$p$,当达到该阀值时就直接删最下行,这样确定出的优先级是先左右后上下。同理,将优先级改为先上下后左右,尽可能的删顶底的两行。在每次枚举时更新答案就好了。
贪心的正确性证明:首先可以确定当横纵都能删时,按先左右后上下的优先级删去纵列后不会影响横行的删去(上次横纵都能删,现在删掉纵列,显然横行还是可以删去);而若纵列能删而横行不能删,那么删去纵列,横行能删的可能性会更高;而若横能删而纵不能删,则删去横行后,要删的纵列数并不会减少,所以后面还是尽可能的删去列,这样可以确定在纵列先与横行的优先级下,删行不会使得答案更优,保持该优先级能确保横行删的次数尽可能的少,所以答案最优为$m+k_1,\; k_1\in[1,n]$。但是可能某种情况下删行时最优(比如每行每列都能删,而行数小于列数),于是确定先上下后左右的优先级后,尽可能减少删列的次数,删行的最优解为$n+k_2,\; k_2\in[1,m]$。两者取最小值就是答案了。
代码:
#include<bits/stdc++.h>
#define il inline
#define ll long long
#define For(i,a,b) for(int (i)=(a);(i)<=(b);(i)++)
#define Bor(i,a,b) for(int (i)=(b);(i)>=(a);(i)--)
using namespace std;
const int N=;
int k,n,m,sl[N][N],sr[N][N],a[N][N],ans=0x7fffffff; il int gi(){
int a=;char x=getchar();
while(x<''||x>'')x=getchar();
while(x>=''&&x<='')a=(a<<)+(a<<)+x-,x=getchar();
return a;
} il void solve(){
int ln,rn,lm,rm,tot,sum;
For(p,,m){
ln=,rn=n,lm=,rm=m,tot=;
while(ln<=rn&&lm<=rm){
tot++;
sum=sl[ln][rm]-sl[ln][lm-];
if(sum<=k){ln++;continue;}
sum=sl[rn][rm]-sl[rn][lm-];
if(sum<=k){rn--;continue;}
sum=sr[lm][rn]-sr[lm][ln-];
if(sum<=k&&lm<p){lm++;continue;}
sum=sr[rm][rn]-sr[rm][ln-];
if(sum<=k){rm--;continue;}
tot=0x7fffffff;break;
}
ans=min(ans,tot);
}
For(p,,n){
ln=,rn=n,lm=,rm=m,tot=;
while(ln<=rn&&lm<=rm){
tot++;
sum=sr[lm][rn]-sr[lm][ln-];
if(sum<=k){lm++;continue;}
sum=sr[rm][rn]-sr[rm][ln-];
if(sum<=k){rm--;continue;}
sum=sl[ln][rm]-sl[ln][lm-];
if(sum<=k&&ln<p){ln++;continue;}
sum=sl[rn][rm]-sl[rn][lm-];
if(sum<=k){rn--;continue;}
tot=0x7fffffff;break;
}
ans=min(ans,tot);
}
} int main(){
k=gi(),m=gi(),n=gi();
For(i,,n) For(j,,m) a[i][j]=gi(),sl[i][j]=sl[i][j-]+a[i][j];
For(i,,m) For(j,,n) sr[i][j]=sr[i][j-]+a[j][i];
solve();
cout<<ans;
return ;
}
P3444 [POI2006]ORK-Ploughing的更多相关文章
- [洛谷P3444] [POI2006]ORK-Ploughing
洛谷题目链接[POI2006]ORK-Ploughing 题目描述 Byteasar, the farmer, wants to plough his rectangular field. He ca ...
- 洛谷P3444 [POI2006]ORK-Ploughing [枚举,贪心]
题目传送门 ork 格式难调,题面就不放了. 分析: 一道偏难的贪心和枚举题.考试的时候是弃疗了...yyb巨佬已经讲的很详细了,推荐他的博客.这里小蒟蒻就只放代码了. Code: #include& ...
- [POI2006]ORK-Ploughing(贪心,枚举)
[POI2006]ORK-Ploughing 题目描述 Byteasar, the farmer, wants to plough his rectangular field. He can begi ...
- 【BZOJ】【1520】【POI2006】Szk-Schools
网络流/费用流 比较裸的一道题 依旧是二分图模型,由源点S连向每个学校 i (1,0),「注意是连向第 i 所学校,不是连向学校的标号m[i]……唉这里WA了一次」 然后对于每所学校 i 连接 j+n ...
- BZOJ1510: [POI2006]Kra-The Disks
1510: [POI2006]Kra-The Disks Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 265 Solved: 157[Submit][ ...
- bzoj 1513 [POI2006]Tet-Tetris 3D(二维线段树)
1513: [POI2006]Tet-Tetris 3D Time Limit: 30 Sec Memory Limit: 162 MBSubmit: 540 Solved: 175[Submit ...
- BZOJ1524: [POI2006]Pal
1524: [POI2006]Pal Time Limit: 5 Sec Memory Limit: 357 MBSubmit: 308 Solved: 101[Submit][Status] D ...
- BZOJ1511: [POI2006]OKR-Periods of Words
1511: [POI2006]OKR-Periods of Words Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 174 Solved: 92[Su ...
- Poi2006 Palindromes
2780: Poi2006 Palindromes Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 15 Solved: 5[Submit][Stat ...
随机推荐
- ThinkPHP框架介绍
什么是框架 php框架是许多代码的集合,这些代码的程序结构的代码(并不是业务代码)代码中有许多的函数,类,功能类包 不使用框架开发的缺陷 代码编写不规范 牵一发而动全身 不能很好满足客户各方面的需求 ...
- 双击 ajax修改单元格里的值
最终效果 列表页面表格里双击排序修改其值 按钮样式要引入bootstrap才可以用 本文件用的是laravel框架环境 larave路由里 Route::get('category/changesta ...
- ReentrantLock详解
ReentrantLock概述 ReentrantLock是Lock接口的实现类,可以手动的对某一段进行加锁.ReentrantLock可重入锁,具有可重入性,并且支持可中断锁.其内部对锁的控制有两种 ...
- SSM框架搭建步骤
首先要导入相关的jar包(spring\spring-core\spring-jdbc\spring-aop\spring-context\spring-webmvc\junit\commons-la ...
- Linux命令备忘录:quota显示磁盘已使用的空间与限制
quota命令用于显示用户或者工作组的磁盘配额信息.输出信息包括磁盘使用和配额限制. 语法 quota(选项)(参数) 选项 -g:列出群组的磁盘空间限制: -q:简明列表,只列出超过限制的部分: - ...
- C语言:类型、运算符、表达式
看了一天书,有点累了.就写写随笔记录一下今天的复习成果吧. C语言的基本数据类型 数值型:整型数,浮点数,布尔数,复数和虚数. 非数值型:字符. 整数最基本的是int,由此引出许多变式诸如有符号整数s ...
- Python3爬虫(七) 解析库的使用之pyquery
Infi-chu: http://www.cnblogs.com/Infi-chu/ pyquery专门针对CSS和jQuery的操作处理 1.初始化字符串初始化 from pyquery impor ...
- (数据科学学习手札16)K-modes聚类法的简介&Python与R的实现
我们之前经常提起的K-means算法虽然比较经典,但其有不少的局限,为了改变K-means对异常值的敏感情况,我们介绍了K-medoids算法,而为了解决K-means只能处理数值型数据的情况,本篇便 ...
- [Cracking the Coding Interview] 4.3 List of Depths
Given a binary tree, design an algorithm which creates a linked list of all the nodes at each depth. ...
- SET UPDATE TASK LOCAL (ローカル更新 )
ローカル更新では.更新プログラムは要求を処理したのと同じワークプロセスによって実行されます.ダイアログユーザは更新が終了するまで待ってから追加データを入力しなければなりません.データベースへのアクセス ...