每日一题:奶牛赛跑

该博客主要介绍了如何解决一道编程问题,即计算两头奶牛在赛跑过程中领头者变化的次数。通过描述每头奶牛的速度和奔跑时间,利用动态规划的方法,确定在不同时间点哪头奶牛领先,并计算出变化次数。博主提供了详细的输入输出格式和样例解释,并给出了相应的代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

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

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

例如,贝茜可能首先以 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;
    
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值