Description

Byteasar想耕种他那块矩形的田,他每次能耕种矩形的一边(上下左右都行),在他每次耕完后,剩下的田也一定是矩形,每块小区域边长为1,耕地的长宽分别为m和n,不幸的是Byteasar只有一匹老弱的马,从马开始耕地开始,只有当它耕完了一边才会停下休息。但有些地会非常难耕以至于马会非常的累,因此Byteasar需要特别小心。当耕完了一边之后,马可以停下来休息恢复体力。每块地耕种的难度不一,但是Byteasar都非常清楚。我们将地分成m x n块单位矩形——我们用坐标(I,j)来定义它们。每块地都有一个整数T[I,J],来定义(I,j)的耕种难度。所以每次马耕一边地时的难度就是所有它耕种的地的难度总和,对于这匹虚弱的马而言,这个值不能超过他的体力值。Byteasar想知道在马不死掉的情况下最少需要耕多少次才能把地耕完。

Input

第一行三个整数,K,M,N。1<=k<=200 000 000,1<=m,n<=2000.其中K表示马的体力值。

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

Output

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

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

题解:贪心

首先,如果确定了最后一次耕地是竖着耕的时候,那么可以确定总共竖着耕了M次(想一想,为什么?)。因此,竖着耕的次数确定了,我们只需要使横着耕的次数最少即可。对此,我们枚举和最后一次竖着耕的那根竖条的上端点高度,则只需要下端点尽量往下延伸即可。 

因此贪心的顺序应该这样:

先贪心左右竖条,能耕则耕,再贪心上横条,最后再贪心下横条,这样的方法必是当前枚举的量中最优的(再想一想,这又是为什么?)。设枚举的上端点为L时,贪心的下端点最下为R。则此时的解为m+n-(r-l+1),如果能更新答案则加入ANS。

我用的是类似记忆化搜索的实现,不过因为贪心竖条,所以只要记录横条的情况l,r,则不必记录竖条情况

同理对于最后一次耕地时横着耕的情况类似。

时间复杂度(n+m)^2;

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int f[][],t2[][],t1[][],k,n,m,a[][],ans;
int dfs(int l,int r,int L,int R)
{
int x1,x2;
if (f[l][r]!=-) return f[l][r];
while (L<=R&&t1[L][r]-t1[L][l-]<=k) L++;
while (L<=R&&t1[R][r]-t1[R][l-]<=k) R--;
if (L>R)
{
f[l][r]=;
return f[l][r];
}
f[l][r]=2e9;
if (t2[R][l]-t2[L-][l]<=k&&((x1=dfs(l+,r,L,R))!=-))
f[l][r]=min(f[l][r],x1+);
if (t2[R][r]-t2[L-][r]<=k&&((x2=dfs(l,r-,L,R))!=-))
f[l][r]=min(f[l][r],x2+);
if (f[l][r]==2e9) f[l][r]=-;
return f[l][r];
}
int main()
{int i,j;
cin>>k>>m>>n;
for (i=;i<=n;i++)
{
for (j=;j<=m;j++)
scanf("%d",&a[i][j]);
}
for (int i=; i<=n; i++)
for (int j=; j<=m; j++)
t1[i][j]=a[i][j]+t1[i][j-],t2[i][j]=a[i][j]+t2[i-][j];
for (i=;i<=m;i++)
for (j=;j<=m;j++)
f[i][j]=-;
ans=dfs(,m,,n);
if (ans==-) ans=2e9;
else ans=ans+n;
for (int i=; i<=max(n,m); i++)
for (int j=i+; j<=max(n,m); j++)
swap(a[i][j],a[j][i]);
swap(n,m);
for (int i=; i<=n; i++)
for (int j=; j<=m; j++)
t1[i][j]=a[i][j]+t1[i][j-],t2[i][j]=a[i][j]+t2[i-][j];
for (i=;i<=m;i++)
for (j=;j<=m;j++)
f[i][j]=-;
int x=dfs(,m,,n);
if (x==-) x=2e9;
else x=x+n;
ans=min(ans,x);
cout<<ans<<endl;
}
												

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

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

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

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

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

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

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

  4. BZOJ1510: [POI2006]Kra-The Disks

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

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

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

  6. BZOJ1524: [POI2006]Pal

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

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

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

  8. Poi2006 Palindromes

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

  9. bzoj1513【POI2006】Tet-Tetris 3D

    1513: [POI2006]Tet-Tetris 3D Time Limit: 30 Sec  Memory Limit: 162 MB Submit: 733  Solved: 245 [Subm ...

  10. P3436 [POI2006]PRO-Professor Szu

    P3436 [POI2006]PRO-Professor Szu 题目描述 n个别墅以及一个主建筑楼,从每个别墅都有很多种不同方式走到主建筑楼,其中不同的定义是(每条边可以走多次,如果走边的顺序有一条 ...

随机推荐

  1. 利用1.1.1.1进行DNS网络加速,仅需2分钟让网络更快

    NEWS 近日,Cloudflare 和 APNIC联合推出了1.1.1.1DNS网络加速. Cloudflare 运行全球规模最大.速度最快的网络之一.APNIC 是一个非营利组织,管理着亚太和大洋 ...

  2. c语言第一次作业——输入与输出格式

    一.PTA实验作业 1.温度转换 本题要求编写程序,计算华氏温度150°F对应的摄氏温度.计算公式:C=5×(F−32)/9,式中:C表示摄氏温度,F表示华氏温度,输出数据要求为整型. 1.实验代码 ...

  3. iOS中CocoaPods的安装及错误详解

    什么是CocoaPods CocoaPods是OS X和iOS下的一个第三类库管理工具,通过CocoaPods工具我们可以为项目添加被称为"Pods"的依赖库(这些类库必须是Coc ...

  4. Flask 学习 六 大型程序结构

    pip freeze >requirement.txt 自动生成版本号 pip install -r requirement.txt 自动下载对应的库 梳理结构 config.py #!/usr ...

  5. MariaDB/MySQL存储过程和函数

    本文目录:1.创建存储过程.函数 1.1 存储过程的IN.OUT和INOUT2.修改和删除存储过程.函数3.查看存储过程.函数信息 在MySQL/MariaDB中,存储过程(stored proced ...

  6. 【TensorFlow随笔】关于一个矩阵与多个矩阵相乘的问题

    问题描述: Specifically, I want to do matmul(A,B) where  'A' has shape (m,n)  'B' has shape (k,n,p) and t ...

  7. Linux入门:usermod - 修改用户帐户信息

    一.什么是usermod? usermod 命令通过修改系统帐户文件来修改用户账户信息usermod [options] user_name选项(options)-a|--append ##把用户追加 ...

  8. kubernetes入门(06)kubernetes的核心概念(3)

    一.API 对象 API对象是K8s集群中的管理操作单元.K8s集群系统每支持一项新功能,引入一项新技术,一定会新引入对应的API对象,支持对该功能的管理操作.例如副本集Replica Set对应的A ...

  9. Python生成随机验证码

    Python生成随机验证码,需要使用PIL模块. 安装: pip3 install pillow 基本使用 1.创建图片 from PIL import Image img = Image.new(m ...

  10. Struts(十七):通过CURD来学习paramsPrepareParams拦截器栈

    背景: 通过上一章节<Struts(十六):通过CURD来学习Struts流程及ModelDriven的用法>学习了ModelDriven拦截器的用法,上章节中讲到了edit功能. 要修改 ...