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 ...
随机推荐
- sorted 返回字典的所有键
- pgm终
这里罗列一些看完此书后遗留的问题: 常用 model 通过 BP/LBP 重新审视 inference 部分 Lauritzen algorithm/Lauritzen-Spiegelhalter a ...
- Leetcode 242.有效的字母异位词 By Python
给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的一个字母异位词. 示例 1: 输入: s = "anagram", t = "nagaram" ...
- [luogu4264][USACO18FEB]Teleportation
题解 先吐槽一波题目:便便传送门,出题人还真的有一点厉害的滑稽. 废话不多说. 首先问题的本质就是求如果当这个传送门的端点位于\(y\)的时候,最小的求出总代价,我们设为函数\(f(y)\). 因为这 ...
- 【转】Linux系统进程的知识总结,进程与线程之间的纠葛
我们先打个比方,多线程是十字路口多线程是平面交通系统,造价低,但是红绿灯多,老堵车,而多进程是则是立交桥,虽然造价高,上下坡多耗油,但是不堵车.这是一个抽象的概念.相信大家看完会有这种感觉. 进程和线 ...
- emwin之GUIBuilder使用控件命名技巧
@2018-07-30 使用emwin-GUIBuilder布局界面时,各控件命名技巧及规则如下图所示(遵循此规则在写代码时好处多多) > 如上图所示所使用的第一组控件分别为 Text.Edit ...
- 洛谷 P2463 [SDOI2008]Sandy的卡片 解题报告
P2463 [SDOI2008]Sandy的卡片 题意 给\(n(\le 1000)\)串,定义两个串相等为"长度相同,且一个串每个数加某个数与另一个串完全相同",求所有串的最长公 ...
- c语言可变参
一.什么是可变参数 在C语言编程中有时会遇到一些参数个数可变的函数,例如printf(),scanf()函数,其函数原型为: int printf(const char* format,…),int ...
- Error configuring application listener of
最近在做spring+struts2+IbatIS的项目,昨天eclipse启动服务器正常,结果今天来了就总是报错,错误如下:严重: Error configuring application lis ...
- 焦点监听事件FocusListener
public class Demo extends JFrame { public Demo() { setBounds(100, 100, 200, 120); setDefaultCloseOpe ...