题目描述

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 提供翻译

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的更多相关文章

  1. [洛谷P3444] [POI2006]ORK-Ploughing

    洛谷题目链接[POI2006]ORK-Ploughing 题目描述 Byteasar, the farmer, wants to plough his rectangular field. He ca ...

  2. 洛谷P3444 [POI2006]ORK-Ploughing [枚举,贪心]

    题目传送门 ork 格式难调,题面就不放了. 分析: 一道偏难的贪心和枚举题.考试的时候是弃疗了...yyb巨佬已经讲的很详细了,推荐他的博客.这里小蒟蒻就只放代码了. Code: #include& ...

  3. [POI2006]ORK-Ploughing(贪心,枚举)

    [POI2006]ORK-Ploughing 题目描述 Byteasar, the farmer, wants to plough his rectangular field. He can begi ...

  4. 【BZOJ】【1520】【POI2006】Szk-Schools

    网络流/费用流 比较裸的一道题 依旧是二分图模型,由源点S连向每个学校 i (1,0),「注意是连向第 i 所学校,不是连向学校的标号m[i]……唉这里WA了一次」 然后对于每所学校 i 连接 j+n ...

  5. BZOJ1510: [POI2006]Kra-The Disks

    1510: [POI2006]Kra-The Disks Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 265  Solved: 157[Submit][ ...

  6. bzoj 1513 [POI2006]Tet-Tetris 3D(二维线段树)

    1513: [POI2006]Tet-Tetris 3D Time Limit: 30 Sec  Memory Limit: 162 MBSubmit: 540  Solved: 175[Submit ...

  7. BZOJ1524: [POI2006]Pal

    1524: [POI2006]Pal Time Limit: 5 Sec  Memory Limit: 357 MBSubmit: 308  Solved: 101[Submit][Status] D ...

  8. BZOJ1511: [POI2006]OKR-Periods of Words

    1511: [POI2006]OKR-Periods of Words Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 174  Solved: 92[Su ...

  9. Poi2006 Palindromes

    2780: Poi2006 Palindromes Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 15  Solved: 5[Submit][Stat ...

随机推荐

  1. pip安装拓展包--网络超时/Read timed out问题

    pip安装拓展包--网络超时/Read timed out问题 解决方案:切换镜像源(墙皮太厚) 在后面加上: -i https://pypi.douban.com/simple example: p ...

  2. vuex重置所有state(可定制)

    在正式场景中我们经常遇到一个问题,就是登出页面或其他操作的时候,我们需要重置所有的vuex,让其变为初始状态,那么,就涉及到了多种方法:1.页面刷新: window.location.reload() ...

  3. I/O流、序列化

    1)流序列化对象ObjectOutputStream调用writerObject写出序列化对象,ObjectInputStream调用readObject读取序列化对象,序列化的对象必须要实现Seri ...

  4. sort函数

    做项目的时候,排序是一种经常要用到的操作.如果每次都自己写个冒泡之类的O(n^2)排序,不但程序容易超时,而且浪费宝贵的时间,还很有可能写错.STL里面有个sort函数,可以直接对数组排序,复杂度为n ...

  5. 生产Web架构优化方案(动态转静态)

    Infi-chu: http://www.cnblogs.com/Infi-chu/ 一.门户新闻业务: 1. 特点:网页一旦发布,再次改动网页内容的几率很低,新闻业务内容的静态化相对比较简单 2. ...

  6. HBase-site.xml 常见重要配置参数

    HBase 常见重要配置参数 (1) Hbase.rpc.timeout rpc 的超时时间,默认 60s,不建议修改,避免影响正常的业务,在线上环境刚开始配置的是 3 秒,运行半天后发现了大量的 t ...

  7. c/c++指针理解

    指针的概念 指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址.要搞清一个指针需要搞清指针的四方面的内容:指针的类型,指针所指向的类型,指针的值或者叫指针所指向的内存区,还有指针本身所占 ...

  8. babel配置

      首页 首页 首页 博客园 博客园 博客园 联系我 联系我 联系我 demo demo demo GitHub GitHub GitHub 管理 管理 管理 魔魔魔芋芋芋铃铃铃 [02]websto ...

  9. PowerPC为什么会没落,我自己的反思学习总结

    PowerPC为什么会没落? Intel通过酷睿,拉大优势,使得苹果抛弃PowerPC   PowerPC当年异常强大,曾经是Xbox的处理器,是Mac的处理器,占据了服务器的半壁江山:当时刚刚接触C ...

  10. 网页设计简史看设计&代码“隔膜”

    本文来自网易云社区 作者:马宝 设计与代码之间隔膜所在?既然你诚心诚意地问了,我就大发慈悲地告诉你.为了防止地球被破坏,为了维护世界的和平,为了贯彻爱与真实的邪恶~,我是穿梭在前端与设计之间爱与美丽的 ...