评测传送门

【题目描述】
  已知花坛为一个 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)的更多相关文章

  1. CF 115B Lawnmower(贪心)

    题目链接: 传送门 Lawnmower time limit per test:2 second     memory limit per test:256 megabytes Description ...

  2. "大哥,割草机借我用一下,我修整一下草坪。" ---- 谈谈this与JavaScript函数调用的不解之缘

    在写上一篇有关apply和call的博文时(闲聊JS中的apply和call),起初我还是担心大家理解起来比较困难,因为要理解apply调用方式的前提是,至少先理解在JavaScript中函数调用是什 ...

  3. CF115B Lawnmower(贪心)

    CF115B Lawnmower \(solution:\) 很明显的一道贪心题,奇数行只能向左走,偶数行只能向右走,每一行的起点应该在上一行就已确定,而这一行的终点只和(这一行最后一棵草(相对于你走 ...

  4. CF115B Lawnmower

    题目描述 You have a garden consisting entirely of grass and weeds. Your garden is described by an n×mn×m ...

  5. 普林斯顿微积分读本 大纲与重点 (by zzd)

    普林斯顿微积分读本 大纲重点 由于博客园太菜,所以我用图片上传. 当前更新状态:未完待续,挖坑暂时不填了. UPD(2018-07-08): 稍微更一下,加一个本书的某一版本下载链接:https:// ...

  6. Lawnmower(洛谷 CF115B)

    题目看这里 题目大意 简单来讲就是从(1,1)向左或右或下走,经过所有草坪的最短路程 思路: 由于在第一行只能向右走,那么我们就知道,在单数行和双数行分别是向右走和向左走,那么我们在单数行就只需要统计 ...

  7. CIFAR10/CIFAR100数据集介绍

    CIFAR-10/CIFAR-100数据集解析 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考文献 CIFAR-10/CIFAR-100数据集 CIFAR-10和CIFAR-100被标记 ...

  8. 《徐徐道来话Java》:PriorityQueue和最小堆

    在讲解PriorityQueue之前,需要先熟悉一个有序数据结构:最小堆. 最小堆是一种经过排序的完全二叉树,其中任一非终端节点数值均不大于其左孩子和右孩子节点的值. 可以得出结论,如果一棵二叉树满足 ...

  9. 基於tiny4412的Linux內核移植--- 中斷和GPIO學習(2)

    作者 彭東林 pengdonglin137@163.com 平臺 tiny4412 ADK Linux-4.4.4 u-boot使用的U-Boot 2010.12,是友善自帶的,爲支持設備樹和uIma ...

随机推荐

  1. [转帖]认识固态:SSD硬盘内外结构解析

    认识固态:SSD硬盘内外结构解析 来自: 中关村在线 收藏 分享 邀请 固态硬盘(Solid State Drive),简称固态盘(SSD),是用固态电子存储芯片阵列而制成的硬盘,由控制单元和存储单元 ...

  2. springmvc+mybatis 处理图片(二):显示图片

    数据库及配置文件等参考:springmvc+mybatis 处理图片(一):上传图片思路:把图片二进制信息写入到HttpServletResponse 的outputStream输出流中来显示图片.一 ...

  3. 再谈MySql索引

    一.索引简介 MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度. 索引分单列索引(主键索引.唯一索引.普通索引)和组合索引.单列索引,即一个索引只包含单个列 ...

  4. P3320 [SDOI2015]寻宝游戏 解题报告

    P3320 [SDOI2015]寻宝游戏 题目描述 小B最近正在玩一个寻宝游戏,这个游戏的地图中有\(N\)个村庄和\(N-1\)条道路,并且任何两个村庄之间有且仅有一条路径可达.游戏开始时,玩家可以 ...

  5. 使用IPMI控制/监控Linux服务器

    1       IPMI简述 IPMI提供了很多丰富功能,我使用的功能,说得大白话一点,就是: 1.获取本设备的硬件信息:包括CPU和主板的温度.电压.风扇转速. 2.在设备A上,通过命令,控制远程设 ...

  6. 【linux之文件查看,操作,权限管理】

    一.shell如何处理命令 1.shell会根据在命令中出现的空格字符,将命令划分为多个部分 2.判断第一个字段是内部命令还是外部命令 内部命令:内置于shell的命令(shell builtin) ...

  7. 安装logstash5.4.1,并使用grok表达式收集nginx日志

    关于收集日志的方式,最简单性能最好的应该是修改nginx的日志存储格式为json,然后直接采集就可以了. 但是实际上会有一个问题,就是如果你之前有很多旧的日志需要全部导入elk上查看,这时就有两个问题 ...

  8. C++继承与组合的区别

    C++程序开发中,设计孤立的类比较容易,设计相互关联的类却比较难,这其中会涉及到两个概念,一个是继承(Inheritance),一个是组合(Composition).因为二者有一定的相似性,往往令程序 ...

  9. Git 常用操作(二)

    第一次传数据:echo "# miya" >> README.mdgit initgit add README.mdgit commit -m "first ...

  10. Android 5.0 Lollipop SDK下载地址(PASS)

    Android 5.0 ARM EABI v7a System Image https://dl-ssl.google.com/android/repository/sys-img/google_ap ...