0
点赞
收藏
分享

微信扫一扫

奶牛赛跑(春季每日一题 39)

为了解决谁是跑的最快的奶牛的长期争论,贝茜和艾希决定在农场中来一场赛跑。

两头奶牛在同一时间从同一地点出发,朝同一方向奔跑。

每个奶牛的奔跑过程都可以划分为若干段。

在每一段行程中,奶牛的奔跑速度相同。

例如,贝茜可能首先以 奶牛赛跑(春季每日一题 39)_前缀和 的速度奔跑 奶牛赛跑(春季每日一题 39)_枚举_02 单位时间,然后以 奶牛赛跑(春季每日一题 39)_i++_03 的速度奔跑 奶牛赛跑(春季每日一题 39)_模拟_04 单位时间。

贝茜和艾希的总跑步时间相同。

两头奶牛希望你帮助计算在她们的赛跑中,领头者的变化次数。

当上一次的领头者是 奶牛赛跑(春季每日一题 39)_前缀和_05 的情况下,如果 奶牛赛跑(春季每日一题 39)_#define_06 超过了 奶牛赛跑(春季每日一题 39)_前缀和_05,成为了领头者,那么领头者的变化就发生了。

例如,如果 奶牛赛跑(春季每日一题 39)_前缀和_05 是领头者,然后 奶牛赛跑(春季每日一题 39)_#define_06 超过了 奶牛赛跑(春季每日一题 39)_前缀和_05,这就算是一次领头者的变化。

如果 奶牛赛跑(春季每日一题 39)_前缀和_05 是领头者,然后 奶牛赛跑(春季每日一题 39)_#define_06 追上了 奶牛赛跑(春季每日一题 39)_前缀和_05 并与他齐头并进一段时间,最终 A 超过了 奶牛赛跑(春季每日一题 39)_前缀和_05,这也算是一次领头者的变化。

输入格式
第一行包含两个整数 奶牛赛跑(春季每日一题 39)_i++_15奶牛赛跑(春季每日一题 39)_枚举_16,表示贝茜的奔跑过程可分为 奶牛赛跑(春季每日一题 39)_i++_15 段,艾希的奔跑过程可分为 奶牛赛跑(春季每日一题 39)_枚举_16 段。

接下来 奶牛赛跑(春季每日一题 39)_i++_15 行,每行描述一段贝茜的奔跑过程,包含两个整数,分别表示贝茜的奔跑速度以及她以这个速度奔跑的时间(两个整数都在 奶牛赛跑(春季每日一题 39)_#define_20 范围内)。

接下来 奶牛赛跑(春季每日一题 39)_枚举_16 行,每行描述一段艾希的奔跑过程,包含两个整数,分别表示艾希的奔跑速度以及她以这个速度奔跑的时间(两个整数都在 奶牛赛跑(春季每日一题 39)_#define_20 范围内)。

输出格式
输出赛跑中领头者的变化次数。

数据范围
奶牛赛跑(春季每日一题 39)_i++_23

输入样例:

4 3
1 2
4 1
1 1
2 10
2 3
1 2
3 9

输出样例:

2

样例解释
奶牛赛跑(春季每日一题 39)_i++_24 时,艾希保持领先位置。

奶牛赛跑(春季每日一题 39)_#define_25 时,贝茜追上艾希,并以相同速度奔跑一个单位时间。

随后贝茜提速,超过艾希(第一次领头者变化)。

短暂时间后,艾希提速,超过贝茜(第二次领头者变化)并保持领先至结束。

#include<iostream>

#define x first
#define y second

using namespace std;

typedef pair<int, int> PII;

const int N = 1010;

int n, m;
PII a[N], b[N];
int sa[N], sb[N];

int main(){

cin >> n >> m;

int tsum = 0;

for(int i = 1; i <= n; i++) cin >> a[i].x >> a[i].y, sa[i] = sa[i-1]+a[i].y;
for(int i = 1; i <= m; i++) cin >> b[i].x >> b[i].y, sb[i] = sb[i-1]+b[i].y;

int t = 0, idx1 = 1, idx2 = 1;
int sm1 = 0, sm2 = 0;
int res = 0;
int last_head = 0;
while(t < sa[n]){

int time;
if(sa[idx1] < sb[idx2]) time = sa[idx1] - t;
else time = sb[idx2] - t;
t += time;
sm1 += time * a[idx1].x;
sm2 += time * b[idx2].x;
int cur_head = 0;

if(sm1 > sm2) cur_head = 1;
else if(sm2 > sm1) cur_head = 2;

if(last_head && cur_head && last_head != cur_head) res++;

if(cur_head) last_head = cur_head;

if(t >= sa[idx1]) idx1++;
if(t >= sb[idx2]) idx2++;
}

cout << res << endl;

return 0;
}


举报

相关推荐

0 条评论