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 ...
随机推荐
- JAXB java类与xml互转
JAXB(Java Architecture for XML Binding) 是一个业界的标准,是一项可以根据XML Schema产生Java类的技术.该过程中,JAXB也提供了将XML实例文档反向 ...
- python读取写入内存方法SringIO,BytesIO
python中不仅仅可以在磁盘中写入文件,还允许直接在内存中直接写入数据:需要借助StringIO和BytesIO来实现: 1.直接操作StringIO from io import StringIO ...
- debian8安装harbor
这里的系统版本是debian8.8,harbor版本为1.1.2. 1.安装docker-ce 1.1.Install packages to allow apt to use a repositor ...
- php高效遍历文件夹、高效读取文件
/** * PHP高效遍历文件夹(大量文件不会卡死) * @param string $path 目录路径 * @param integer $level 目录深度 */ function fn_sc ...
- 解题:NOI 1999 生日蛋糕
题面 裸的搜索题,就说剪枝(注:nw->noww->当前,res->rest->剩余): 1.想达到$Nπ$的体积,那么半径一开始最多也就$sqrt(n)$了,再大就超了... ...
- 小议主子表INT自增主键插入记录的方法SQL server]教程
http://www.chinesejy.com/jishu/508/519/2006061781665.html 主子表最常见的大概就是用在进销存.MRP.ERP里面,比如一张销售订单,订单Orde ...
- ORB原理与源码解析
转载: http://blog.csdn.net/luoshixian099/article/details/48523267 CSDN-勿在浮沙筑高台 没有时间重新复制代码,只能一股脑的复制,所以代 ...
- python 文件路径问题
需要用到 os 模块和 sys 模块 import os print(__file__)# 输出相对路径 print(os.path.abspath(__file__)) #输出绝对路径 # D:\P ...
- 抓包工具Charles
Charles Charles可以在windows,linux,mac各种操作系统上安装使用,它是java编写一款非免费工具:而fiddler只能在windows系统上使用 Charles抓包前,要确 ...
- day12 继承
设计原则:开闭原则:对于拓展open,对于修改close. 类与类的关系:1.is a(继承关系) 2.has a(组合关系) 继承的优点:1.代码的可重用性 2.父类的属性和方法用于子类 3.子类可 ...