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;
}

浙公网安备 33010602011771号