CF1324C Frog Jumps 题解

Posted bifanwen

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CF1324C Frog Jumps 题解相关的知识,希望对你有一定的参考价值。

原题链接

简要题意:

现在河面上有 (n+2) 块石头,编号 (0)(n+1)(1)~(n) 块石头每块上有一个方向,如果是 (L),那么青蛙到这块石头上之后只能往左跳,如果是 (R) 只能往右,当然,第 (0) 块石头的方向是 (R).

现在青蛙要从 (0) 跳到 (n+1),请问他应该怎么跳才能让他跳跃过程中跳跃距离最长的最小呢?输出这个距离。

显然,我们考虑贪心。

C题一点也不难啊

你想,如果你既可以跳到 (L) 点,又可以跳到 (R) 点,那么你会选哪个呢?
当然是 (R) 点啦!

如何说明呢?(严谨点)

如果 (L)(R) 的左边,那跳到 (L) 之后,只能一直往左,直到跳到一个 (R) 为止(总不能跳回去)。那么,你在跳这若干个 (L) 的第一个 (L) 的时候,既然能跳到 (L),那你直接选那个 (R) 不就行了,还浪费这么多步。

如果 (L)(R) 的右边,那跳到 (L) 之后,你只能回到这个 (R) 点;否则你只能一直往后跳,直到另一个 (R);那么你跳过来的路径又被你从跳回去了,还得再跳回来,那有什么意思,还浪费这么多步。

所以,上述已经说明,我们不跳 (L),只跳 (R) 是最优的。(最少步数)

那么,最小的最长跳跃距离是多少呢?不就是相邻两个 (R) 的最大距离吗?

分析了这么多,终于找到了题目的本质,直接可以解决问题了!

时间复杂度: (O(T imes n)).

因为总长度不超过 (10^5),所以是 (O(10^5)).

空间复杂度: (O(n)).

实际得分:(100pts).

#pragma GCC optimize(2)
#include<bits/stdc++.h>
using namespace std;

const int N=2e5+1;

inline int read(){char ch=getchar();int f=1;while(ch<‘0‘ || ch>‘9‘) {if(ch==‘-‘) f=-f; ch=getchar();}
	int x=0;while(ch>=‘0‘ && ch<=‘9‘) x=(x<<3)+(x<<1)+ch-‘0‘,ch=getchar();return x*f;}

int T,n;
char s[N];

int main(){
	T=read(); while(T--) {
		scanf("%s",s);
		n=strlen(s);
		int k=-1,maxi=0; //k是上一个 R 的位置。因为 s 数组从 0 开始,所以这里从 -1 开始
		for(int i=0;i<n;i++)
			if(s[i]==‘R‘) {
				maxi=max(i-k,maxi); //与上一个 R 的位置的距离
				k=i; //更新 R 的位置
			} 
		printf("%d
",max(maxi,n-k));	//最后一个 R 到终点的距离也算一个答案
	}
	return 0;
}

以上是关于CF1324C Frog Jumps 题解的主要内容,如果未能解决你的问题,请参考以下文章

C - Frog Jumps

codeforces 1324 C. Frog Jumps(贪心/二分)

CodeChef Chef and Digit Jumps 题解

题解Luogu P3509 [POI 2010] ZAB-Frog 倍增dp

hdu 5037 Frog(贪心)

cf 模拟