见面与问候

众所周知,奶牛是非常有社交礼貌的动物:每当两头奶牛分开后相遇,它们都会用友好的“哞哞”声互相问候。

奶牛贝茜和她的朋友艾希正在农夫约翰的农场中的一条很长的道路上散步。

我们可以将此道路视为一个一维数轴。

贝茜和艾希都从原点出发,以相同的速度(1 单位距离/单位时间)行走一段时间。

请根据每头奶牛的运动情况描述,确定它们相互打招呼的次数。

贝茜和艾希可以在不同的时间点停止移动,并且她们的移动时间都不会超过 1000000 单位。

输入格式

第一行包含两个整数 B 和 E。

接下来 B 行,描述了贝茜的移动。每行包含一个正整数后跟一个字符 L 或 R,表示贝茜沿某个方向(左或者右)移动了若干单位距离。

再接下来 E 行,描述了艾希的移动。每行包含一个正整数后跟一个字符 L 或 R,表示艾希沿某个方向(左或者右)移动了若干单位距离。

输出格式

输出她们相互打招呼的次数。

注意,在最初位于初始位置时,她们不打招呼。

数据范围

1≤B,E≤50000

输入样例:

4 5
3 L
5 R
1 L
2 R
4 R
1 L
3 L
4 R
2 L

输出样例:

3

样例解释

贝茜和艾希在时间 7,9,13 碰面打招呼。

源代码

#include <iostream>
using namespace std;
const int N = 1e6+10;
int a[N],b[N];//分别记录贝茜和艾希的每秒位置,下标为对应的秒数
int main()
{
    int n,m;
    cin>>n>>m;
    int idxa=1,idxb=1;
    while(n--)//记录贝茜位置
    {
        int s;
        char flag;
        cin>>s>>flag;
        while(s--)//记录每秒位置
        {
            if(flag=='R')a[idxa]=a[idxa-1]+1;
            else if(flag=='L')a[idxa]=a[idxa-1]-1;
            idxa++;
        }
    }
    //记录结束,idxa会自增一,真正有效位置的下标仅仅为0-idxa-1
    while(m--)//记录艾希位置
    {
        int s;
        char flag;
        cin>>s>>flag;
        while(s--)//记录每秒位置
        {
            if(flag=='R')b[idxb]=b[idxb-1]+1;
            else if(flag=='L')b[idxb]=b[idxb-1]-1;
            idxb++;
        }
    }
    //记录结束,idxb会自增一,真正有效位置的下标仅仅为0-idxb-1
    int ans= 0;
    for(int i = 1; i < idxa || i < idxb; i++)//遍历最大长度
    {
        if(i >= idxa) a[i] = a[i - 1];//若i大于等于idxa,则a数组要继承最后一次不再变动时的位置
        if(i >= idxb) b[i] = b[i - 1];//若i大于等于idxb,则b数组要继承最后一次不再变动时的位置
        //并排向前走a[i] - a[i - 1] + b[i] - b[i - 1]=2
        //并排向后走a[i] - a[i - 1] + b[i] - b[i - 1]=-2
        //一者不动另一者向前走a[i] - a[i - 1] + b[i] - b[i - 1]=1
        //一者不动另一者向后走a[i] - a[i - 1] + b[i] - b[i - 1]=-1
        //二者反向移动趋向或者远离a[i] - a[i - 1] + b[i] - b[i - 1]=0
        if((abs(a[i] - a[i - 1] + b[i] - b[i - 1]) < 2)) ans += (a[i] == b[i]);
        //因并排走时不计数,仅仅在碰头是计数,那么数组是逐秒记录的,也就是最多只能移动1
        //那么在碰头的时刻当abs(a[i] - a[i - 1] + b[i] - b[i - 1])等于1时为贝茜不动艾希走的情况或者为艾希不动贝茜走的情况
        //但是走的情况不确定方向
        //那么在碰头的时刻当abs(a[i] - a[i - 1] + b[i] - b[i - 1])等于0时为二者都走的情况,走的情况仅为二者反向
        //这样就排除了同向的情况
        //那么在进行移动的时候,当a[i]==b[i]时,也就是当某一时刻二者位置相同时,ans才加一
        //否则即为虽然产生了位移但是不符合二者位置相同的情况,a[i]!=b[i],即ans+0
    }
    cout<<ans<<endl;
    return 0;
}

猜你喜欢

转载自blog.csdn.net/couchpotatoshy/article/details/124516804