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 ...
随机推荐
- Ubuntu安装使用中的一些注意事项
在win7上安装VMware workstations10.0 ,在VMware workstations10.0上安装Ubuntu14.04 64位时,关于网络的连接注意: win7 网络连接里上的 ...
- es6 let关键字
1.let关键字 var arr = [ ]; for(var i=0; i<10; i++){ arr [i] = function(){ alert(i) } } arr [8](); // ...
- ACM数论之旅3---最大公约数gcd和最小公倍数lcm(苦海无边,回头是岸( ̄∀ ̄))
gcd(a, b),就是求a和b的最大公约数 lcm(a, b),就是求a和b的最小公倍数 然后有个公式 a*b = gcd * lcm ( gcd就是gcd(a, b), ( •̀∀•́ ) ...
- java 基础 --静态
1. 静态变量和静态代码块是在JVM加载类的时候执行的(静态变量被赋值,以后再new时不会重新赋值),执行且只执行一次2. 独立于该类的任何对象,不依赖于特定的实例,被类的所有实例(对象)所共享3. ...
- java 数据结构与算法---二叉树
原理来自百度百科 推荐数据演示网址 :https://www.cs.usfca.edu/~galles/visualization/BST.html 一.什么是二叉树 二叉树的每个结点至多只有 ...
- [MYSQL] 如何彻底卸载MYSQL5.x
找了这么久,只有这个可以完全卸载~~~,转自http://www.doc88.com/p-9435498025667.html
- mappers标签引入映射器的四种方式
第一种方式:mapper标签,通过resource属性引入classpath路径的相对资源 <!-- Using classpath relative resources --> < ...
- Bob Waters - Twenty Years
We were just children and grown up closeHow we made it this far only god knowsWe bend the rulesSmash ...
- 搜索引擎(Solr-索引详解)
时间字段类型特别说明 Solr中提供的时间字段类型( DatePointField, DateRangeField,废除的TrieDateField )是以时间毫秒数来存储时间的. 要求字段值以ISO ...
- 【ARC068F】Solitaire
Description 你有一个双端队列和 \(N\) 个数字,先按 \(1\) 到 \(N\) 的顺序每次从任意一端插入当前数字,再进行 \(N\) 次操作每次可以从两端弹出,求有多少种弹出序列 ...