問題の半分のエントリ(Eタイトル)へ## 2020年1月14日のトレーニングソリューション

タイトルソースHDU-6261

ミューテックスとHDU-6261-リッカイン

説明は
時々 、専門用語は、いくつかの人生哲学を巻き込みます。ミューテックスは、そのうちの一つです。夢にあなたの方法で、あなたはいくつかの困難によってロックされて、あなたは彼のステップを停止し、あなたがそれらを介して得るのを助けるために誰かを必要としています。
あなたはミューテックス内部の人生哲学についてよく知っているしやすくするために、リッカインは簡単なタスクを思い付きます。たぶん、あなたのいくつかは、ミューテックスについて少し知っているので、彼女はそれを置き換えるために、別のシーンを使用しています。
そこの行のn個のゲート、ゲートの左側にあるいくつかの人々があり、それらのすべてが右側に行きたいです。黒と白:ゲートの2種類があります。これらの人々は、E = 0、最初は非負の数E.によって表されるエネルギーを、共有しています。
1人は白門を歩く場合は、彼はエネルギーの一点を獲得する、すなわち、Eが1で追加され、1人は黒のゲートを歩くならば、彼はエネルギーの一点を失うことになる、すなわち、Eが差し引かれますE = 0の場合はEは、負でない整数でなければならないので、誰かが白ゲートを介して歩くまで1によって、誰も黒のゲートを通って歩くことができません。あなたはそこに同時に移動する2人も、すべての人々が無私ているではないだろうと仮定することができます。
我々は、ブラックゲートを表現するためにPを使用し、Vは、白色ゲートを表し、行を表すためにPVストリングを使用します。最初は、すべての人々は、文字列の先頭であり、それらのすべては、文字列全体を通過します。しかし残念ながら、時にはそれができない場合があります。だから、彼らは右側に少なくとも1人を送りたいです。
あなたの仕事は、このグループは、この目標を達成するために必要人々の最小数を見つけることです。
行がVPPであれば、例えば、彼らは、少なくとも2人が必要です。最初の白のゲートを通じて最初の人の散歩をし、二人目は、文字列全体を通過するエネルギーのこのポイントを使用することができます。

入力
最初の行は、単一numnerさt(1≤t≤103)、テストケースの数を含んでいます。
ゲートを記述する(≤105| | S1≤)各テストケースのために、最初の行は、PVストリングSを含有します。
S | |> 1000年入力保証付最大で30回のテストケースがあること。

出力
各テストケースについては、出力単一の整数、答え。そして、それが不可能な場合、出力-1。

サンプル入力
4
VPP
VPPVVVVPPPPPPPP
VPPPPPPPPPPPPPP
P

サンプル出力
2
3
14
-1

問題の意味

  • 文字列入力文字列は、文字列の長さは、ドアの数、白いドアのVを表す、ヘルモンのPの代表であります
  • Vスルー場合人、ブラックドアによる全エネルギーの増加、減少、総エネルギー
  • エネルギーは、ブラックドアで0以上である場合
  • 初期エネルギーの誰もが、その後、総エネルギーのプールもあり、0である0
  • セクターワイドを通じて少なくとも1人を掲載し、人々の最小数が必要

問題の解決策

  • 誰もがエネルギーを共有し、渡されたドアに関係なくは、総エネルギープールを変更します
  • 例えば、Vを介して一緒に10人、そしてエネルギー・プール上のエネルギーの10
  • 最終目的は、総エネルギーのことで、少なくとも1人のための十分なが、自分の終わりに近づいて

  • VVVPPPPドアの列がある場合
  • することができます誘惑に人を聞かせて -タイタンズの.jpg
  • 彼は前方位置に行っている場合、全体的なエネルギー価格
  • そして、人々の残りの部分ができ、この位置に来たに追いつきます
  • なぜなら人まで、誰もが一緒に来て、それがされます、さらに上昇
  • 人の下には、誰も一緒になり、来てより多くの秋
  • だから、確実にするために最大のエネルギー安全にこれらのエネルギーを使用するボディケア保険の攻撃部隊を

  • 場合は最初のドアはPで歩いた、エネルギープールは、どんなに歩いて、負になるだろう
  • したがって、ドアPプログラム(Pは説明しない最初の仮説の隣)を達成することが可能で初めてではない場合にのみ
  • 最悪の場合は、ということである最初のドアがVであるすべてのPが続きます
  • だから、最初のドアを含め完全にドアlenはまでを長く配置が同じくらいでlen-1個人に十分な友人を
  • 以上のほとんどを指し、少なくとも中で最も最低必要とする人の数は、最悪の場合発生はしているほとんどの
  • 総LENドアが、手配+ lenは、1 + lenは、lenの 10086 ... 個人的には確かにあまりにもすることができますが、議論されていません
  • だから、人々の目標数の半分たびに人々の数を確認することができる質問の意味を満たすの友人には

  • [中間]変数の数を見つけます
  • [合計]変数エネルギープール
  • 関数【解決】問題は、トピックを解決することができるかどうかを決定します
  • 場合満たすために人々の数は、それほど忘れないように小さいトライ数を、すべての後に、見つけることです少なくとも(O゚▽゚)O人の数をか行くために

知識ポイントを含みます

  • 二部 アルゴリズム(この質問に属し整数半分)
  • 二分法アルゴリズムについて-リンクブログのカバーを参照半分を

ACコード

#include<stdio.h>
#include<string>
#include<iostream>
using namespace std;
string put;
int check(int mid)
{
	int len=put.length(),total=0,before=total;
	for(int i=0;i<len;i++)
	{
		if(put[i]=='P') total--;
		else total++;
		if(total<0) return 0;
		else
		{
			if(total<=before) continue;
			else
			{
				total+=mid-1;
				before=total;
			}
		}
	}
	return 1;
}
int main()
{
	int T;
	cin>>T;
	while(T--)
	{
		cin>>put;
		if(put[0]=='P') printf("-1\n");
		else//二分所需要的人数,1-put.length() 
		{
			int left=1,right=put.length(),mid;
			while(left<=right)
			{//left==right的时候还要判断是否可以check,如果不可以,还要放大一位 
				mid=(left+right)>>1; 
				//用>>1位移代替/2时间复杂度更小
				if(check(mid)) right=mid-1;
				else left=mid+1;
			}
			cout<<left<<endl;
		}
	}
	return 0;
}
公開された20元の記事 ウォンの賞賛0 ビュー401

おすすめ

転載: blog.csdn.net/qq_46184427/article/details/104073801