题目:传送门
思路: 找两个最近的相向运动的原子即可,我的做法是每次记录最后一个向R方向走的点,遍历到L方向的点时,更新最大值即可.
注意每个原子的位置输入时不是按顺序的,需要我们自己排序
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
const long long inf = 1e18;
struct node
{
long long f;//方向
long long x;//位置
};
node a[200010];
bool cmp(const node& x,const node& y) {
return x.x<y.x;
}
int main() {
int n;
string s;
cin>>n>>s;
for(int i=0;i<s.size();i++) {
if(s[i] == 'L') {
a[i].f = -1;
}
else a[i].f = 1;
}
for(int i=0;i<n;i++) cin>>a[i].x;
sort(a,a+n,cmp);
long long last_l = -1;
long long last_r = -1;
long long ans = inf;
for(int i=0;i<n;i++) {
//cout<<a[i].f<<' '<<a[i].x<<endl;
if(a[i].f == -1) {
if(last_r==-1) continue;
else {
ans = min(ans,(a[i].x-last_r)/2);
}
last_l = a[i].x;
}
else {
last_r = a[i].x ;
}
}
if(ans == inf) cout<<"-1"<<endl;
else cout<<ans<<endl;
return 0;
}