思路:二分时间。
代码:
#include<bits/stdc++.h> using namespace std; #define ll long long #define pb push_back #define mem(a,b) memset(a,b,sizeof(a)) int n; string s; bool check(int t) { int now=-1,bean=-2;//now是上一个P覆盖到的位置,bean是没有被上一个P覆盖到的第一个星星 for(int i=0;i<n;i++) { if(s[i]=='*') { if(bean<=now)bean=i; } else if(s[i]=='P') { if(now<bean) { if(i-bean>t)return false; else now=max((t-(i-bean))/2+i,bean+t-(i-bean));//P有两种走法,一种先往前再往后,另一种先往后再往前 } else { now=i+t; } } } return now>=bean; } int binasrh(int l,int r) { if(l==r)return l; int m=(l+r)>>1; if(check(m))binasrh(l,m); else binasrh(m+1,r); } int main() { ios::sync_with_stdio(false); cin.tie(0); cin>>n>>s; cout<<binasrh(0,1000000)<<endl; return 0; }