AcWing 1995. 见面与问候--模拟(通俗易懂)
原题链接
简单
#include<bits/stdc++.h>
using namespace std;
struct node{
int now,f;
//now记录位置,向右+1,向左-1
//f为1表示向右,-1表示向左,0表示停在原地
}a[1000005],b[1000005];
int main(){
int n,m;cin>>n>>m;
int ans=0;
a[0].now=b[0].now=0;
int sum_time1=0,sum_time2=0;
for(int i=1,j=1;i<=n;i++){
int x;char c;
cin>>x>>c;
sum_time1+=x;//记录总移动时间
while(x--){
if(c=='R'){
a[j].now=a[j-1].now+1;
a[j].f=1;
}
else{
a[j].now=a[j-1].now-1;
a[j].f=-1;
}
j++;
}
}
for(int i=1,j=1;i<=m;i++){
int x;char c;
cin>>x>>c;
sum_time2+=x;////记录总移动时间
while(x--){
if(c=='R'){
b[j].now=b[j-1].now+1;
b[j].f=1;
}
else{
b[j].now=b[j-1].now-1;
b[j].f=-1;
}
j++;
}
}
int sum=max(sum_time1,sum_time2);
//可能有一个人已经停止了,但是另一个人还在走
//那么已经停止的那个人的位置保持不变,记方向为0
if(sum>sum_time1){
for(int j=sum_time1+1;j<=sum;j++){
a[j].now=a[j-1].now;
a[j].f=0;
}
}
else{
for(int j=sum_time2+1;j<=sum;j++){
b[j].now=b[j-1].now;
b[j].f=0;
}
}
for(int i=1;i<=sum;i++){
if(a[i].now==b[i].now){
if(a[i].f!=b[i].f)
ans++;
}
}
cout<<ans<<endl;
return 0;
}