数据范围
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 碰面打招呼。
题解
模拟方法解决
- 首先将输入固定化到两个index数组,index数组存储每一秒牛所在的位置,index记录长度为最长运动时间那头牛决定,0s的时候位置在0(注意这是因为他们的速度都是1单位/s)
- 然后判断两头牛在每个时间节点所处的位置是否相同
- 此外注意特例初始位置两头牛的相遇不算
- 注意两头相遇且并排走了一段路只算遇到的开始为相遇。
#include <iostream>
#include <stdio.h>
#include <cstring>
#include <algorithm>
#include <vector>
using namespace std;
int main(int argc, char** argv) {
int b,e;
cin>>b>>e;
int b_arr[b];
for(int i = 0;i<b;i++){
cin>>b_arr[i];
char c;
cin>>c;
if(c == 'L') b_arr[i] = -b_arr[i];
}
int e_arr[e];
for(int i = 0;i<e;i++){
cin>>e_arr[i];
char c;
cin>>c;
if(c == 'L') e_arr[i] = -e_arr[i];
}
vector<int> b_index,e_index;
b_index.push_back(0);
for(int i = 0;i<b;i++){
// 记录每个时间点b所在的位置
for(int j = 0;j<abs(b_arr[i]);j++){
if(b_arr[i]<0) b_index.push_back(b_index[b_index.size()-1]-1); // 相对上一个时钟想左走
else b_index.push_back(b_index[b_index.size()-1]+1);
}
}
e_index.push_back(0);
for(int i = 0;i<e;i++){
// 记录每个时间点b所在的位置
for(int j = 0;j<abs(e_arr[i]);j++){
if(e_arr[i]<0) e_index.push_back(e_index[e_index.size()-1]-1); // 相对上一个时钟想左走
else e_index.push_back(e_index[e_index.size()-1]+1);
}
}
// 延续两者的时间位置到一样长度
while(e_index.size()<b_index.size()){
e_index.push_back(e_index[e_index.size()-1]);
}
while(b_index.size()<e_index.size()){
b_index.push_back(b_index[b_index.size()-1]);
}
int ans = 0;
int flag = 1; // 表示是否相遇,注意每次不相遇后再次相遇才会叫
for(int i = 1;i<e_index.size();i++){
if(e_index[i] == b_index[i] and flag == 0){
// 相遇且之前并不并排走,则算相遇一次
ans++,flag = 1;
}
else if(e_index[i] == b_index[i] and flag == 1) {
// 保持并排,不算相遇
continue;
}
else{
// 错开了
flag = 0;
}
}
cout<<ans<<endl;
return 0;
}