见面与问候(思维)

题意

有两头牛在一维坐标轴上行走,他们分开后每次相遇都会打招呼。

分别给出这两头牛的行走情况,每次行走给出行走时间和方向,每一单位时间行走\(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;
}
posted @ 2022-04-26 19:15  pbc的成长之路  阅读(15)  评论(0编辑  收藏  举报