CF1324Cカエルは、問題への解決策をジャンプ

オリジナルタイトルリンク

質問の意味簡単に言えば:

今川有する\(N + 2 \)石、ID \(0 \)\(N + 1は\)、\ (1 \) \(N- \)石各ブロックがあれば、方向を有しますである(L \)\それがある場合、次に、その後石のみカエルは、左にジャンプ\(R&LT \)だけ右に、当然のことながら、\(0 \)石のブロックの方向である\(R&LTが\ )

今からカエル(0 \)は\ジャンプ(\ 1 + N-)\、彼はそれの最長最短距離の間にジャンプジャンプジャンプ彼を作る方法を尋ねるべき?この距離の出力。

もちろん、私たちは貪欲考えます。

Cのタイトルは、口で言うされていません

あなたはどちらかのジャンプすることができます場合は、考える(L \)\、彼らはジャンプできるポイントを\(R \)ポイントを、あなたはそれをどのを選ぶのでしょうか?
もちろん\(R \)それのポイント!

どのようにそれを説明するには?(厳密点)

もし\(L \)\(R \)左に、そしてジャンプ\(L \) 唯一のジャンプまで残っていたことができた後に\(R \)まで(バックジャンプすることはできません)。さて、あなたはこの番号にジャンプ\(L \)最初の\(L \) 彼らがジャンプすることを考えると、時間(L \)\、そして、あなたが直接それを選ぶ(R \)\、リストに載っていないだけでなく、そんなにステップを無駄に。

場合は\(L \)\(R \)を右へ、そしてジャンプ\(Lを\)その後、あなただけに戻ることができます\(R \)ポイント、それ以外の場合はあなただけの別までジャンプバックしていることができます\(R \) ;そして、あなたが戻ってからジャンプし、再びパスにスキップし、私はその後ポイント、だけでなく、非常に多くのステップの廃棄物が何であるか、戻ってジャンプしなければなりませんでした。

したがって、上記の説明は、我々はジャンプしないということであった(L \)\ちょうどジャンプ、\(Rは\)が最適です。(ステップの最小数)

だから、最長ジャンプの最小距離はずっとそれを何ですか?ない隣接する二つのこと\(R \)それまでの最大距離?

そんなに分析し、最終的には話題の性質を発見し、あなたが直接問題を解決することができます!

時間の複雑さ:\(O(T \ n回)\)

よりもはやので(10 ^ 5 \)\、それがある(O(10 ^ 5)\)\

宇宙複雑:\(O(N)\)

実際のスコア:\(100のPTS \)

#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\n",max(maxi,n-k));	//最后一个 R 到终点的距离也算一个答案
	}
	return 0;
}

おすすめ

転載: www.cnblogs.com/bifanwen/p/12550138.html