http://gdutcode.sinaapp.com/problem.php?cid=1025&pid=6
诺亚方舟
Description
“终有一天,耶和华的光会普照大地,旧的世界将会毁灭,新的世界将会产生。” ——《启示录·天启》
2096年11月8日,世界末日终于还是来临了。
而此时,世界上最后一个“神” —— sytrakl 也已经苏醒。他按照《圣经》的指引,找到了唯一能解救人类的“诺亚方舟”,并向全世界宣布任何人都可以进入方舟避难。
所有的人类知道消息后都疯狂了,他们纷纷赶来。由于怕触怒“神”,他们老老实实的在诺亚方舟的门前排起了队(方舟在队伍的最右边)。
sytrakl在英国的圣保罗大教堂沉睡了几百年,即使已经苏醒,却还保留着英国的“绅士风度”。 所以虽然方舟的体积足够大,但他还是决定让女人先行(即所有女人都在队伍右边)。于是他规定:
每一秒时间里,队伍里所有右边有男人的女人跟右边的男人调换位置。
sytrakl希望知道需要多少时间才能实现目的。然而sytrakl无所不能,但偏偏不懂编程。所以他找到了你(高兴吧!Excited!),希望你能帮他完成这个工作。
Ps:如果做不到,那你肯定药丸。
Input
题目有多组输入。每组将给出一串长度为n的字符串(1<=n<=1000000),有两种字符,‘M’表示这是一个男人,‘W’表示这是一个女人。
Output
输出总共需要多少时间。
Sample Input
Sample Output
即wait[cnt] = wait[cnt-1] - len + 1;
dp[cnt] = wait[cnt] + i-(cnt-1);
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstdlib>
#include <limits>
#include <queue>
#include <stack>
#include <vector>
#include <map>
using namespace std;
typedef long long LL;
#define N 4151000
#define INF 0x3f3f3f3f
#define PI acos (-1.0)
#define EPS 1e-5
#define met(a, b) memset (a, b, sizeof (a))
int dp[N], wait[N];
char str[N];
int main ()
{
while (scanf ("%s", str) != EOF)
{
met (dp, 0);
met (wait, 0);
int len = 0, cnt = 0, maxn = 0;
for (int i=0; str[i]; i++)
{
if (str[i]=='M')
{
cnt++;
if (wait[cnt-1] - len + 1 >= 0)//如果小于0的话说明不需要等待,即wait[cnt]=0;
wait[cnt] = wait[cnt-1] - len + 1;
dp[cnt] = wait[cnt] + i-(cnt-1);
if (cnt==i+1)
{
dp[cnt] = 0;
wait[cnt] = 0;
}
maxn = max (maxn, dp[cnt]);
len = 0;
}
else len++;
}
printf ("%d\n", maxn);
}
return 0;
}