见面与问候(思维)
题意
有两头牛在一维坐标轴上行走,他们分开后每次相遇都会打招呼。
分别给出这两头牛的行走情况,每次行走给出行走时间和方向,每一单位时间行走\(1\)单位距离。
他们的行走时间不超过\(10^6\)。
求他们打招呼的次数。
思路
由于时间范围较小,因此我们可以存储每头牛每一时刻的位置,记为\(a\)和\(b\):
- 如果往右走,那么\(a_t = a_{t - 1} + 1\)
- 如果往左走,那么\(a_t = a_{t - 1} - 1\)
需要注意一点,如果其中一头牛在\(t_1\)时刻停下,另一头牛在\(t_2\)时刻停下,并且\(t_1 < t_2\)。则第一头牛在\(t_1 + 1 \sim t_2\)时刻的位置与在\(t_1\)时刻的位置相同。
如果\(a_i = b_i\),并且行走方向相反或一头牛停止,即\(|a_i - a_{i - 1} + b_i - b_{i - 1}| < 2\),则答案\(+1\)。
代码
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 1000010;
int n, m;
int a[N], b[N];
int main()
{
scanf("%d%d", &n, &m);
int t1 = 0, t2 = 0;
for(int i = 0; i < n; i ++) {
int d;
char op[5];
scanf("%d%s", &d, op);
for(int j = 0; j < d; j ++) {
t1 ++;
if(*op == 'L') a[t1] = a[t1 - 1] - 1;
else a[t1] = a[t1 - 1] + 1;
}
}
for(int i = 0; i < m; i ++) {
int d;
char op[5];
scanf("%d%s", &d, op);
for(int j = 0; j < d; j ++) {
t2 ++;
if(*op == 'L') b[t2] = b[t2 - 1] - 1;
else b[t2] = b[t2 - 1] + 1;
}
}
int ans = 0;
int t = max(t1, t2);
for(int i = 1; i <= t; i ++) {
if(i > t1) a[i] = a[t1];
if(i > t2) b[i] = b[t2];
}
for(int i = 1; i <= t; i ++) {
if(a[i] == b[i] && abs(a[i] - a[i - 1] + b[i] - b[i - 1]) < 2) {
ans ++;
}
}
printf("%d\n", ans);
return 0;
}