传送门:QAQ
题意:给你一串字符串,v代表一个人走过可以获得一点能量,p代表一个人走过消耗一点能量,然后能量是公用的,问你最少派多少个人能使一个人到达终点。
思路:二分我们要派的人,然后在我们检查人数是否可行时只要模拟一个人行走,如果走过去是有价值的,就让后面的人跟上,并怎加相应的价值。判断是否能走到终点即可。
代码:
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<stack>
#include<vector>
#include<queue>
#include<set>
#include<map>
#include<algorithm>
using namespace std;
const int INF = 0x3f3f3f3f;
#define LL long long int
int t;
char ch[110000];
int check(int x) {
int sum = 0;
int pos = 0;
int pre = 0;
while (pos < strlen(ch)) {
if (ch[pos] == 'P') {
sum -= 1;
}
else sum += 1;
if (sum < 0) return 0;
else if (sum > pre) {
sum += (sum-pre)*(x - 1);
pre = sum;
}
pos++;
}
return 1;
}
int main(void) {
scanf("%d", &t);
while (t--) {
scanf("%s", ch);
int left = 1;
if (ch[0] == 'P') {
printf("-1\n");
continue;
}
int right = strlen(ch);
int ans = -1;
while (left <= right) {
int mid = (left + right) / 2;
if (check(mid)) {
ans = mid;
right = mid - 1;
}
else
left = mid + 1;
}
printf("%d\n", ans);
}
return 0;
}