zzd 的割草机(Lawnmower)
【题目描述】
已知花坛为一个 n * m 的矩形,草只会长在某些个格子上,zzd 有一个割草机,一开始,
zzd 站在(1,1)处,面向(1,m)(面向右).每次 zzd 有两个选择(耗费一个单位时间):
1:向自己面朝的方向移动一格。
2:向下移动一格,并改变自己的朝向。
但 zzd 不能向上移动,也不能后退,因为他喜欢 DP,不想有后效性.
只要 zzd 移动到有杂草的格子,zzd 会清除杂草(不需要耗时)。现在,zzd 想知道最少要耗费多少时间才能清除所有杂草。
【输入】
第一行 n,m. 接下来 n 行,每行 m 个字符,其中'W'表示杂草,'G'表示空地。
【输出】
至少要耗费多少时间才能清除所有杂草。
【样例】
Lawnmower.in
4 5
GWGGW
GGWGG
GWGGG
WGGGG
Lawnmower.out
11【数据范围】
n,m<=150
思路:
虽然zzd很喜欢DP 但是我并不知道怎么用DP做 ???
感觉是模拟啊
由题目可以知道:在奇数行 zzd的方向一定是向右的
在偶数行 zzd的方向一定是向左的
然后算出每行走到什么位置就可以了
输入的时候只要存 l[ ],r[ ] 表示每行最左边的杂草的列数 和最右边的杂草列数
再记一下每一行的总杂草数s[ ] 就可以啦
然后特别要注意特判 考虑几种特殊情况:
1.这一行没有杂草 但是下一行有
假如这一行要向左走 那么取 min的时候就会选到0了
2.这一行没有杂草 并且此时要向左走 但是下一行有
但是下一行最左边的杂草在现在所在位置的右边
如果不特判它对答案的贡献将为负
3.还有几行格子没走完 但是已经清理完所有的杂草了
直接输出答案结束程序即可
还有一个注意的点,关于统计答案的:
假如这行从 a 走到 b 那么ans+=b-a+1
后面这个+1是因为 走完这一行之后就要向下走到下一行
但是当你割最后一束杂草的时候是不需要再往下走了
所以最后的 ans 要 -1
CODE:
#include<iostream>
#include<cstdio>
#include<string>
#define go(i,a,b) for(register int i=a;i<=b;i++)
#define yes(i,a,b) for(register int i=a;i>=b;i--)
#define M 150+10
using namespace std;
int read()
{
int x=,y=;char c=getchar();
while(c<''||c>'') {if(c=='-') y=-;c=getchar();}
while(c>=''&&c<='') {x=(x<<)+(x<<)+c-'';c=getchar();}
return x*y;
}
string s;
int n,m,ans,nw=,res,l[M],r[M],sm[M];
int main()
{
freopen("Lawnmower.in","r",stdin);
freopen("Lawnmower.out","w",stdout);
n=read();m=read();
go(i,,n)
{
cin>>s;
go(j,,m-) if(s[j]=='W') { if(!l[i]) l[i]=j+; r[i]=j+;sm[i]++;res++;}
}
go(i,,n)
{
if(i%) //奇数行
{
int right=max(r[i],r[i+]);
if(!right && i==n) right=r[i];
if(!right || right<nw) right=nw;
ans+=right-nw+;nw=right;res-=sm[i];
}
else //偶数行
{
int left=min(l[i],l[i+]);
if(!left && l[i]) left=l[i];
if(!left && l[i+]) left=l[i+];
if(!left || left>nw) left=nw;
ans+=nw-left+;nw=left;res-=sm[i];
}
if(!res) break ;
}
printf("%d",ans-);
return ;
}
zzd 的割草机(Lawnmower)的更多相关文章
- CF 115B Lawnmower(贪心)
题目链接: 传送门 Lawnmower time limit per test:2 second memory limit per test:256 megabytes Description ...
- "大哥,割草机借我用一下,我修整一下草坪。" ---- 谈谈this与JavaScript函数调用的不解之缘
在写上一篇有关apply和call的博文时(闲聊JS中的apply和call),起初我还是担心大家理解起来比较困难,因为要理解apply调用方式的前提是,至少先理解在JavaScript中函数调用是什 ...
- CF115B Lawnmower(贪心)
CF115B Lawnmower \(solution:\) 很明显的一道贪心题,奇数行只能向左走,偶数行只能向右走,每一行的起点应该在上一行就已确定,而这一行的终点只和(这一行最后一棵草(相对于你走 ...
- CF115B Lawnmower
题目描述 You have a garden consisting entirely of grass and weeds. Your garden is described by an n×mn×m ...
- 普林斯顿微积分读本 大纲与重点 (by zzd)
普林斯顿微积分读本 大纲重点 由于博客园太菜,所以我用图片上传. 当前更新状态:未完待续,挖坑暂时不填了. UPD(2018-07-08): 稍微更一下,加一个本书的某一版本下载链接:https:// ...
- Lawnmower(洛谷 CF115B)
题目看这里 题目大意 简单来讲就是从(1,1)向左或右或下走,经过所有草坪的最短路程 思路: 由于在第一行只能向右走,那么我们就知道,在单数行和双数行分别是向右走和向左走,那么我们在单数行就只需要统计 ...
- CIFAR10/CIFAR100数据集介绍
CIFAR-10/CIFAR-100数据集解析 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考文献 CIFAR-10/CIFAR-100数据集 CIFAR-10和CIFAR-100被标记 ...
- 《徐徐道来话Java》:PriorityQueue和最小堆
在讲解PriorityQueue之前,需要先熟悉一个有序数据结构:最小堆. 最小堆是一种经过排序的完全二叉树,其中任一非终端节点数值均不大于其左孩子和右孩子节点的值. 可以得出结论,如果一棵二叉树满足 ...
- 基於tiny4412的Linux內核移植--- 中斷和GPIO學習(2)
作者 彭東林 pengdonglin137@163.com 平臺 tiny4412 ADK Linux-4.4.4 u-boot使用的U-Boot 2010.12,是友善自帶的,爲支持設備樹和uIma ...
随机推荐
- (三)使用Jmeter模拟300个用户登录
1.首先在系统中创建300个用户(在这里使用 pl/sql 进行循环创建): 代码如下: --先对原先的表进行备份 :CREATE TABLE sys_user_bak AS SELECT * FRO ...
- js dom学习
创建dom元素 var oLi = document.creteElement('li'); //创建livar aLi = oUl.getElementsByTagName('li');oLi.in ...
- 关于MyEclipse,JDK使用的几点收获
[1]MyEclipse如何修改JDK编译版本信息 首先打开MyEclipse——>windows——>preference(也就是 窗口——>首选项:可以在搜索框中输入JDK,查找 ...
- Android Studio系列教程
Android Studio系列教程 Android Studio系列教程一 —- 下载与安装 Android Studio系列教程二 —- 基本设置与运行 Android Studio系列教程三 — ...
- UpdateBatch到底是怎么用的?
要使用ADOQuery的UpdateBatch函数,必须将ADOQuery的LockType属性设置成ltBatchOptimistic
- sqlserver查询数据库中包含某个字段的所有表和所有存储过程
1.查询包含某字段的所有表 select object_name(id) objName,Name as colName from syscolumns where (name like'%你要查询的 ...
- 每日一问(常用的集合接口和类有哪些【二】)—ArrayList类和数组之间的转换
ArrayList的实质是数组,但是在类的实例中所存储的数组是无法访问的,因此实际上是无法直接作为数组使用,那么如何将这两者进行转化呢? Collection接口定义了toArray的方法,可将实现该 ...
- MT【146】一边柯西,一边舍弃
(2018浙江省赛9题)设$x,y\in R$满足$x-6\sqrt{y}-4\sqrt{x-y}+12=0$,求$x$的范围______ 解答:$x+12=6\sqrt{y}+4\sqrt{x-y} ...
- [AT697]フィボナッチ
题目大意:给你$n,k(n\leqslant10^9,k\leqslant10^3)$,求$f_n$.$f$数组满足$f_1=f_2=\cdots=f_k=1$,$f_n=\sum\limits_{i ...
- WEB入门.五 页面设计简介
学习内容 Ø XHTML 的发展历程 Ø XHTML 和 HTML 的区别 Ø XHTML的DOCTYPE和基本标签 Ø CSS 常用属性 能力 ...