为了解决谁是跑的最快的奶牛的长期争论,贝茜和艾希决定在农场中来一场赛跑。
两头奶牛在同一时间从同一地点出发,朝同一方向奔跑。
每个奶牛的奔跑过程都可以划分为若干段。
在每一段行程中,奶牛的奔跑速度相同。
例如,贝茜可能首先以 55 的速度奔跑 33 单位时间,然后以 1010 的速度奔跑 66 单位时间。
贝茜和艾希的总跑步时间相同。
两头奶牛希望你帮助计算在她们的赛跑中,领头者的变化次数。
当上一次的领头者是 BB 的情况下,如果 AA 超过了 BB,成为了领头者,那么领头者的变化就发生了。
例如,如果 BB 是领头者,然后 AA 超过了 BB,这就算是一次领头者的变化。
如果 BB 是领头者,然后 AA 追上了 BB 并与他齐头并进一段时间,最终 AA 超过了 BB,这也算是一次领头者的变化。
输入格式
第一行包含两个整数 NN 和 MM,表示贝茜的奔跑过程可分为 NN 段,艾希的奔跑过程可分为 MM 段。
接下来 NN 行,每行描述一段贝茜的奔跑过程,包含两个整数,分别表示贝茜的奔跑速度以及她以这个速度奔跑的时间(两个整数都在 1..10001..1000 范围内)。
接下来 MM 行,每行描述一段艾希的奔跑过程,包含两个整数,分别表示艾希的奔跑速度以及她以这个速度奔跑的时间(两个整数都在 1..10001..1000 范围内)。
输出格式
输出赛跑中领头者的变化次数。
数据范围
1≤N,M≤10001≤N,M≤1000
输入样例:
4 3
1 2
4 1
1 1
2 10
2 3
1 2
3 9
输出样例:
2
样例解释
t<3t<3 时,艾希保持领先位置。
t=3t=3 时,贝茜追上艾希,并以相同速度奔跑一个单位时间。
随后贝茜提速,超过艾希(第一次领头者变化)。
短暂时间后,艾希提速,超过贝茜(第二次领头者变化)并保持领先至结束。
题目分析:
利用时间数组来存储每一秒的位置信息,如果有超越更新答案,如果位置不相同更新flag
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 10000100;
const int M = 1010;
int s1[N],s2[N];
int ss1[N],ss2[N];
int n,m;
int res = 0;
int main()
{
cin >> n >> m;
//记录总时间
int Time = 0;
for(int i = 0; i < n; i++)
{
cin >> s1[i] >> ss1[i];
Time += ss1[i];
}
for(int i = 0; i < m; i++)
{
cin >> s2[i] >> ss2[i];
}
//flag标记相对位置状态,开始设置-1
int flag = -1,sumA = 0,sumB = 0;
int p = 0,q = 0;
for(int i = 0; i < A; i++)
{
if(ss1[p] != 0)
sumA += s1[p];
else
sumA += s1[++p];
if(ss2[q] != 0)
sumB += s2[q];
else
sumB +=s2[++q];
ss1[p]--;
ss2[q]--;
int temp = sumA > sumB ? 1 : 0;
//如果起步后,并且没有齐头并进更新flag,开始计算。
if(flag == -1 && sumA != sumB) flag = temp;
//只有位置不相同时会出现交替
if(sumA != sumB)
{
//出现交替,答案+1
if(flag != temp)
res++;
//更新flag,只要位置不相同就更新
flag = temp;
}
}
cout << res;
}