[POI2006]ORK-Ploughing

描述

Byteasar 想耕种他那块矩形的田,他每次能耕种矩形的一边(上下左右都行),在他每次耕完后,剩下的田也一定是矩形,每块小区域边长为 1,耕地的长宽分别为 m 和 n,不幸的是 Byteasar 只有一匹老弱的马,从马开始耕地开始,只有当它耕完了一边才会停下休息。但有些地会非常难耕以至于马会非常的累,因此Byteasar 需要特别小心。

当耕完了一边之后,马可以停下来休息恢复体力。每块地耕种的难度不一,但是 Byteasar 都非常清楚。我们将地分成 m x n 块单位矩形——我们用坐标(I,j)来定义它们。每块地都有一个整数 T[I,J],来定义(I,j)的耕种难度。所以每次马耕一边地时的难度就是所有它耕种的地的难度总和,对于这匹虚弱的马而言,这个值不能超过他的体力值HP。

Byteasar 想知道在马不死掉的情况下最少需要耕多少次才能把地耕完。

输入

第一行三个整数, HP,M,N

接下来 N 行每行 M 个整数表示难度值。(0<=难度值<=10 000)

输出

一个整数表示最少的耕种次数(保证马能耕完)。

样例

Sample Input
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
Sample Output
8

提示

1<=HP<=200 000 000,1<=m,n<=2000.


首先,如果确定了最后一次耕地是竖着耕的时候,

那么可以确定总共竖着耕了 M 次。

竖着耕的次数确定了,我们只需要使横着耕的次数最少即可。

对此,我们枚举和最后一次竖着耕的那根竖条的上端点高度,则只需要下端点尽量往下延伸。

那么我们就开始贪心。

先贪心左右竖边,能耕则耕,再贪心上横边,最后再贪心下横边,

这样的方法必是当前枚举的量中最优的。

设枚举的上端点为 L 时,贪心的下端点最下为 R。则此时的解为 m+n-(r-l+1),如果能更新答案则加入 ANS。

同理对于最后一次耕地时横着耕的情况类似(其实把图转一下再解一遍就好了)。

代码蒯上

#include<iostream>
#include<iomanip>
#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
inline int gotcha()
{
register int _a=0;bool _b=1;register char _c=getchar();
while(_c<'0' || _c>'9'){if(_c=='-')_b=0;_c=getchar();}
while(_c>='0' && _c<='9')_a=_a*10+_c-48,_c=getchar();
return _b?_a:-_a;
}
const int _ = 2002;
int col[_][_]={0},ver[_][_]={0},dmg[_][_]={0},tmp[_][_],m,n,HP;
int ponyvile()
{
register int i,j,vl,vr,cl,cr,mi=2e9;
memset(col,0,sizeof(col));memset(ver,0,sizeof(ver));
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
col[j][i]+=col[j-1][i]+dmg[j][i],ver[j][i]+=ver[j][i-1]+dmg[j][i];
for(i=0;i<=m;i++)
{
vl=1,vr=n,cl=1,cr=m;
int ans=i+n;
while(vl<=vr && cl<=cr)
{
if(col[cr][vl]-col[cl-1][vl]<=HP)vl++;
else if(col[cr][vr]-col[cl-1][vr]<=HP)vr--;
else if(cl<=i && ver[cl][vr]-ver[cl][vl-1]<=HP)cl++;
else if(ver[cr][vr]-ver[cr][vl-1]<=HP)cr--,ans++;
else{ans=2e9;break;}
}
mi=min(ans,mi);
}
return mi;
}
#include<map>
map<long double,int>s;
int main()
{
register int i,j,mi=2e9;
HP=gotcha(),m=gotcha(),n=gotcha();
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
dmg[j][i]=tmp[i][j]=gotcha();
mi=ponyvile();
memset(dmg,0,sizeof(dmg));
swap(n,m);
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
dmg[j][i]=tmp[j][i];
printf("%d",min(mi,ponyvile()));
return 0;
}

贪心 - [POI2006]ORK-Ploughing的更多相关文章

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

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

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

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

  3. bzoj 1517 [POI2006]Met 贪心

    [POI2006]Met Time Limit: 15 Sec  Memory Limit: 162 MBSubmit: 203  Solved: 108[Submit][Status][Discus ...

  4. 洛谷 P3434 [POI2006]KRA-The Disks 贪心

    目录 题面 题目链接 题目描述 输入输出格式 输入格式 输出格式 输入输出样例 输出样例 输出样例 说明 思路 AC代码 题面 题目链接 P3434 [POI2006]KRA-The Disks 题目 ...

  5. [POI2006] KRA-The Disks (贪心)

    题目描述 For his birthday present little Johnny has received from his parents a new plaything which cons ...

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

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

  7. 【Luogu3444】ORK-Ploughing(贪心)

    [Luogu3444]ORK-Ploughing(贪心) 题面 Luogu 题解 我们知道,如果我们选定了以横向为主,或者纵向为主, 那么就有尽可能减少另一个方向上耕地的次数 所以分开贪心,但是本质相 ...

  8. P3444 [POI2006]ORK-Ploughing

    题目描述 Byteasar, the farmer, wants to plough his rectangular field. He can begin with ploughing a slic ...

  9. BZOJ 1692: [Usaco2007 Dec]队列变换 [后缀数组 贪心]

    1692: [Usaco2007 Dec]队列变换 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 1383  Solved: 582[Submit][St ...

随机推荐

  1. 一个好用的压力测试工具tsung

    一个好用的压力测试工具tsung          前段时间一直在忙各种事情,快三周没弄过引擎了,今天有点时间,正好之前写的服务器引擎也到了收尾测试的阶段,于是就研究了下怎么测试服务器压力.      ...

  2. Mysql中WHERE IN,UNION 用法详解

    WHERE IN 用法 这里分两种情况来介绍 1.in 后面是记录集,如: select  *  from  table  where   uname  in(select  uname  from  ...

  3. 解决easyUI下拉控件无法触发onkeydown事件

    实现在combotree下拉控件中按Backspace键清除combotree选中的值 下面的代码无法获取到键盘事件 <input class="easyui-combotree&qu ...

  4. 织梦dedecms后台登陆密码充值工具

    下载后解压,根据自己语言版本,把文件radminpass.php放入网站根目录下执行即可 点击下载:织梦dedecms后台登陆密码充值工具

  5. uvm_reg_backdoor——寄存器模型(十)

    寄存器有前门和后门两种访问方式,这儿只看后门访问方式 //----------------------------------------------------------------------- ...

  6. 设置DIV随滚动条滚动而滚动

    有段时间没有碰Web端了,最近做了个功能,需要做个DIV随滚动条滚动而滚动,mark一下: 源码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1 ...

  7. LibreOJ #514. 「LibreOJ β Round #2」模拟只会猜题意

    内存限制:256 MiB 时间限制:1000 ms 标准输入输出 题目类型:传统 评测方式:文本比较 题目描述 给定一个长度为 nnn 的序列 AAA . 定义 f(l,r)=∑i=lrAif(l,r ...

  8. 基于 Ubuntu + nextCloud 搭建自己的私人网盘

    提醒一下,如果之前通过apache搭建了网站,不要用snap命令来搭建,否则,至少有一个无法正常运行(不要问我怎么知道的,都是血的教训啊). 你可以通过腾讯云的实验主机进行尝试. 1.基础设置 切换为 ...

  9. *运算和&运算

    /* &:取地址运算符 *:指针运算符(或称为间接运算符),取指针所指向的对象的内容 */ int a,b; int *pointer_1, *pointer_2; pointer_1 = & ...

  10. 洛谷 P1835 素数密度

    https://www.luogu.org/problemnew/show/P1835 对于40%,对每个数进行最大$O(\sqrt n)$的判断,因为n比较大所以超时. 想到线性筛,然而我们并不能筛 ...