🔗原题
众所周知,奶牛是非常有社交礼貌的动物:每当两头奶牛分开后相遇,它们都会用友好的“哞哞”声互相问候。
奶牛贝茜和她的朋友艾希正在农夫约翰的农场中的一条很长的道路上散步。
我们可以将此道路视为一个一维数轴。
贝茜和艾希都从原点出发,以相同的速度(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 碰面打招呼。
算法1
(模拟)
这道题是要求模拟两头牛的移动情况,主要点是将所有时间点模拟在每一个坐标轴上
Java代码
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int B = sc.nextInt(), E = sc.nextInt(), sum1 = 0, sum2 = 0, res = 0, k;
int LU = 0;
int[] beixi = new int[1000010];
int[] b = new int[1000010];
int[] erxi = new int[1000010];
int[] a = new int[1000010];
int p1 = 1;
for(int i = 0; i < B; i++) {
k = sc.nextInt();
LU = sc.next().charAt(0);
sum1 += k;
while(k-- > 0) {
beixi[p1] = (LU == 'R' ? 1 : -1) + beixi[p1 - 1];
b[p1++] = LU;
}
}
p1= 1;
for(int i = 0; i < E; i++) {
k = sc.nextInt();
LU = sc.next().charAt(0);
sum2 += k;
while(k-- > 0) {
erxi[p1] = (LU == 'R' ? 1 : -1) + erxi[p1 - 1];
a[p1++] = LU;
}
}
for(int i = 0; i < Math.max(sum1, sum2); i++) {
if(i >= sum1 + 1) {
beixi[i] = beixi[i - 1];
}
if(i >= sum2 + 1) {
erxi[i] = erxi[i - 1];
}
if(beixi[i] == erxi[i] && b[i] != a[i]) res++;
}
System.out.println(res);
}
}