[POI2006]ORK-Ploughing
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的更多相关文章
- [洛谷P3444] [POI2006]ORK-Ploughing
洛谷题目链接[POI2006]ORK-Ploughing 题目描述 Byteasar, the farmer, wants to plough his rectangular field. He ca ...
- [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 ...
- bzoj1513【POI2006】Tet-Tetris 3D
1513: [POI2006]Tet-Tetris 3D Time Limit: 30 Sec Memory Limit: 162 MB Submit: 733 Solved: 245 [Subm ...
- P3436 [POI2006]PRO-Professor Szu
P3436 [POI2006]PRO-Professor Szu 题目描述 n个别墅以及一个主建筑楼,从每个别墅都有很多种不同方式走到主建筑楼,其中不同的定义是(每条边可以走多次,如果走边的顺序有一条 ...
随机推荐
- 咸鱼翻身beta冲刺博客集
咸鱼翻身beta冲刺博客集 凡事预则立-于Beta冲刺前 beta冲刺1-咸鱼 beta冲刺2-咸鱼 beta冲刺3-咸鱼 beta冲刺4-咸鱼 beta冲刺5-咸鱼 beta冲刺6-咸鱼 beta冲 ...
- 利用flask 实现简单模版站
from flask import Flask,render_template from flask import request app = Flask(__name__) @app.route(' ...
- hdu 4553 约会安排
约会安排 http://acm.hdu.edu.cn/showproblem.php?pid=4553 Time Limit: 2000/1000 MS (Java/Others) Memory ...
- Spring-Data-JPA整合MySQL和配置
一.简介 (1).MySQL是一个关系型数据库系统,是如今互联网公司最常用的数据库和最广泛的数据库.为服务端数据库,能承受高并发的访问量. (2).Spring-Data-Jpa是在JPA规范下提供的 ...
- raid5 阵列硬盘离线数据恢复成功案例
数据恢复故障描述: 某研究院 DELL 磁盘阵列崩溃,内置15块1TB硬盘搭建的RAID5阵列.一开始有一块硬盘离线,在更换新硬盘进行同步的过程中,第二块磁盘指示灯报警,同步失败,阵列无法正常工作. ...
- js 中bind
function fn(a){ this.innerHTML = a; console.log(this); } //fn("hello"); span1.onclick =fun ...
- 【ASP.NET Core】依赖注入高级玩法——如何注入多个服务实现类
依赖注入在 ASP.NET Core 中起中很重要的作用,也是一种高大上的编程思想,它的总体原则就是:俺要啥,你就给俺送啥过来.服务类型的实例转由容器自动管理,无需我们在代码中显式处理. 因此,有了依 ...
- jenkins简单安装及配置(Windows环境)
jenkins是一款跨平台的持续集成和持续交付.基于Java开发的开源软件,提供任务构建,持续集成监控的功能,可以使开发测试人员更方便的构建软件项目,提高工作效率. Windows平台下,一般安装方法 ...
- proxymysql的安装与应用
具体的资料我们可以查看官方的文档:https://github.com/sysown/proxysql/wiki/ProxySQL-Configuration 推荐下载最新的Proxysql. 下面跟 ...
- vue组件详解(四)——使用slot分发内容
一.什么是slot 在使用组件时,我们常常要像这样组合它们: <app> <app-header></app-header> <app-footer>& ...