CF115B Lawnmower(贪心)
CF115B Lawnmower
$ solution: $
很明显的一道贪心题,奇数行只能向左走,偶数行只能向右走,每一行的起点应该在上一行就已确定,而这一行的终点只和(这一行最后一棵草(相对于你走的方向),以及下一行第一颗草的位置)。所以我们最开始保留每一行中最左边杂草的位置及最右边杂草的位置,这样枚举行时可以简单一些:(只需要将上一行的起点与这一行终点取差即可)
特殊情况:(某一行没有草时)(后面几行都没有草)(第一行如何开始)(最后一行如何结束)
- 没有草:只需要将这一行最左边杂草的位置及最右边杂草的位置全部赋值成上一行终点的位置即可。
- 后面几行都没有草:要特殊处理(详见代码中的\(f\)数组(记录每一行有没有草))
- $ l[0]=1; $ 即可
- 最后一行如何结束:用 $ f $ 数组记录终点行即可
$ code: $
#include<iostream>
#include<cstdio>
#include<iomanip>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<ctime>
#include<cmath>
#include<vector>
#include<queue>
#include<map>
#include<set>
#define ll long long
#define db double
#define inf 0x7fffffff
#define rg register int
using namespace std;
char ch;
int n,m,s=1,k,ff=1,ans;
int l[161];//
int r[161];//最左边的杂草
bool f[161];//最右边的杂草
inline int qr(){
while((ch=getchar())<'0'||ch>'9');
int res=ch^48;
while((ch=getchar())>='0'&&ch<='9')
res=res*10+(ch^48);
return res;
}
inline void init(){
n=qr(),m=qr(); l[0]=1;//初始化
for(rg i=1;i<=n;++i)l[i]=160;
for(rg i=1;i<=n;++i){
for(rg j=1;j<=m;++j){
while((ch=getchar())!='G'&&ch!='W');
if(ch=='W'){l[i]=min(l[i],j);r[i]=j;f[i]=1;}
}if(!f[i])l[i]=r[i]=(i&1?l[i-1]:r[i-1]);//这一行没草,直接搬上一层的!
}l[n+1]=l[n];r[n+1]=r[n];//特殊初始化
}
inline void work(){
for(rg i=n;i;--i)
if(f[i]){ff=i;break;}
for(rg i=1;i<=ff;++i,s=k){
if(i&1)ans+=(k=max(r[i],r[i+1]))-s+1;
else ans+=s-(k=min(l[i],l[i+1]))+1;
}printf("%d\n",--ans);
}
int main(){
//freopen("Lawnmower.in","r",stdin);
//freopen("Lawnmower.out","w",stdout);
init(); work(); return 0;
}
CF115B Lawnmower(贪心)的更多相关文章
- CF115B Lawnmower
题目描述 You have a garden consisting entirely of grass and weeds. Your garden is described by an n×mn×m ...
- CF 115B Lawnmower(贪心)
题目链接: 传送门 Lawnmower time limit per test:2 second memory limit per test:256 megabytes Description ...
- Lawnmower(洛谷 CF115B)
题目看这里 题目大意 简单来讲就是从(1,1)向左或右或下走,经过所有草坪的最短路程 思路: 由于在第一行只能向右走,那么我们就知道,在单数行和双数行分别是向右走和向左走,那么我们在单数行就只需要统计 ...
- BZOJ 1692: [Usaco2007 Dec]队列变换 [后缀数组 贪心]
1692: [Usaco2007 Dec]队列变换 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 1383 Solved: 582[Submit][St ...
- HDOJ 1051. Wooden Sticks 贪心 结构体排序
Wooden Sticks Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) To ...
- HDOJ 1009. Fat Mouse' Trade 贪心 结构体排序
FatMouse' Trade Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- BZOJ 1691: [Usaco2007 Dec]挑剔的美食家 [treap 贪心]
1691: [Usaco2007 Dec]挑剔的美食家 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 786 Solved: 391[Submit][S ...
- 【Codeforces 738D】Sea Battle(贪心)
http://codeforces.com/contest/738/problem/D Galya is playing one-dimensional Sea Battle on a 1 × n g ...
- 【BZOJ-4245】OR-XOR 按位贪心
4245: [ONTAK2015]OR-XOR Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 486 Solved: 266[Submit][Sta ...
随机推荐
- python之Counter类:计算序列中出现次数最多的元素
Counter类:计算序列中出现次数最多的元素 from collections import Counter c = Counter('abcdefaddffccef') print('完整的Cou ...
- 牛客网练习赛7-D-无向图(bfs,链式前向星)
题意:中文题: 思路:就是找某个点距离其他点的距离,他给你很多点也无所谓.用一个dist[]数组,这个数组保存的是他给你的点到其他点的最短距离且标记的作用,然后bfs搜索就行了. 代码: #inclu ...
- 分布式 NewSQL 对比
1.TiDB: 说明: PingCAP 公司基于 Google Spanner / F1 论文实现的开源分布式 NewSQL 数据库. 开源分布式 NewSQL 关系型数据库 TiDB 是新一代开源分 ...
- day11 高阶函数 函数式编程
高阶函数,满足 接收函数作为参数或者返回有函数 函数可以当做参数传递给另一个函数 def foo(n): print(n) def bar(name): print("my name is ...
- 【刷题】LOJ 2863 「IOI2018」组合动作
题目描述 你在玩一个动作游戏.游戏控制器有 \(4\) 个按键,A.B.X 和 Y.在游戏中,你用组合动作来赚金币.你可以依次按这些按键来完成一个组合动作. 这个游戏有一个隐藏的按键序列,可以表示为由 ...
- 自学Linux Shell18.3-sed实用工具
点击返回 自学Linux命令行与Shell脚本之路 18.3-sed实用工具 1. 加倍行间距 命令格式: .......
- Java创建文件
public class FileTest { public static void main(String[] args) throws IOException { File file = new ...
- NOIP2013题解
NOIP2013题解 Day1 转圈游戏 circle 快速幂模板题. #include<iostream> using namespace std; int n,m,k,x; int f ...
- 【codevs2189】数字三角形+
题目大意:给定一个数字三角形,求从 (1,1) 走到最后一行的路径和对 100 取余数的最大值. 题解:由于最优解涉及到取余数的操作,因此按照原先的状态设计并不符合最优子结构性质,即:两个最大数相加取 ...
- Linux下编译安装Lnmp
1.安装nginx 下载链接http://nginx.org/en/download.html (1)下载,解压 wget http://nginx.org/download/nginx-1.15.8 ...