Cow Race(赛牛)

题目描述:
小 A 和小 B 喜欢跑步,都号称是跑步之王,为了比出胜负,他们决定比赛一场。 小 A和小 B 约定好在一条直线上跑步,起步时,在同一地点同一方向和同一时间。 这次规则不一样,我们只需统计出两个人交换领先的次数。 小 A 和小 B,在某个时间段内都是匀速跑的,比如说:时间段为 3,速度为 5,则在整个 3 这个时间段,跑的速度都为 5。 每个时间段的速度可能不一样。 领先判断如下:
1. 当前 A 领先 B,再经过一段时间,B 冲到 A 的前面,则属于一次领先交换;
2. 当前 A 领先 B,经过一段时间,B 跟上来了,跑到与 A 一样的位置,且保持了一段时间; 再过段时间或最后,B 还是超过了 A,则也属于一次领先交换。
现在给定小 A 和小 B 的每段时间的速度,求领先交换的总次数。

输入格式:
第一行为两个空格隔开的整数 N 和 M,分别表示小 A 有 N 段描述,小 B 有 M 段描述,且保证小 A 和小 B 的总时间是一样的;
以下 N 行,每行两个整数,分别表示小 A 跑的速度和维持时间; 紧接着的 M 行,每行两个整数,分别表示小 B 跑的速度和维持时间。

输出格式:
领先交换次数。

样例输入:
4 3
1 2
4 1
1 1
2 10
2 3
1 2
3 9
样例输出:
2
提示:
样例解释:
小 B 在前 3 个时间保持领先; 在第 3 个时间时,两个都跑到了第 6 米,并且都以同样的速度 1 往前跑了 1 个时间; 从第 4 个时间后,小 A 冲到了前面,形成了第一次领先交换;
再过 1 个时间后,小 B 又赶上来了,与 A 在同一位置,但此时小 B 比小 A 的速度快 1,后面的时间小 B 就超过了小 A,形成了第二次领先交换。 一直到最后的时间。

数据范围:
1 <= N, M <= 1000
小 A 和小 B 的每段时间和速度的范围在 1..1000

时间限制: 1000ms
空间限制: 256MB
题解:大意是小牛赛跑,不同时段的速度有所不同,问领先者发生了几次更换。

我是一个时间单位一个时间单位得去模拟的,总时间不长,所以还可以接受。 需要注意的边界情况就是:两头牛齐头并进的时候,此时并没有发生领先者的更换; 二是最开始的时候,也不算在领先者更换的范围之内。

点击查看代码
#include <iostream>
#include <vector>
using namespace std;

int main() {
    long long n, m;
    cin >> n >> m;

    vector<long long> posa, posb; 
    long long v, t;

   
    while (n--) {
        cin >> v >> t;
        long long last_pos = posa.empty() ? 0 : posa.back();
        for (int i = 0; i < t; ++i) {
            posa.push_back(last_pos + v * (i + 1));
        }
    }

  
    while (m--) {
        cin >> v >> t;
        long long last_pos = posb.empty() ? 0 : posb.back();
        for (int i = 0; i < t; ++i) {
            posb.push_back(last_pos + v * (i + 1));
        }
    }

    long long cnt = 0;
    
    for (size_t i = 1; i < posa.size(); ++i) {
        if ((posa[i] > posb[i] && posa[i-1] <= posb[i-1]) ||
            (posa[i] < posb[i] && posa[i-1] >= posb[i-1])) {
            cnt++;
        }
    }

    cout << cnt << "\n";
    return 0;
}
posted @ 2024-08-27 20:23  kiry7769  阅读(39)  评论(0)    收藏  举报