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