K11666 Cow Race[USACO-2013-Mar-B]

题目描述

为了决定出谁是农场上跑的最快的牛,奶牛Bessie和她的朋友Elsie决定在农场上举行一场比赛。两头奶牛从同一位置,同一时间,朝相同的方向开始跑。

每头奶牛的整个跑步过程可以看做是多个"区间段",每个区间段内奶牛的跑步的速度是一样的。比如,Bessie以5的速度跑了3个单位的时间,然后以速度10跑了6个单位的时间。整个过程中Bessie和Elsie跑的总时间是相同的。
请帮助奶牛们计算出,在比赛的过程中领跑者变化的数量是多少?
领跑者变化的意思是:例如在跑步的过程中刚开始是奶牛B领先的,然后在某个时间点奶牛A跑到了奶牛B的前面成了领先者,那么这就是一次领跑者变化。另外如果奶牛B处于领先位置,然后A在一段时间内与B是并行的,最终A领先了,那么这也算作是领跑者变化了。

输入格式

第一行,两个整数N和M(1≤N,M≤1000)
接下来N行,描述奶牛Bessie在比赛过程中的N个区间段,每行两个整数x和y,表示在区间段i内,Bessie以速度x跑了y单位时间,整数的范围都是1到1000
接下来M行,描述奶牛Elsie在比赛过程中的M个区间段,每行两个整数x和y,表示在区间段i内,Elsie以速度x跑了y单位时间,整数的范围都是1到1000

输出格式

输出一行,一个整数,表示在比赛期间领跑者变化的总数量

输入输出样例

输入样例1:
4 3 1 2 4 1 1 1 2 10 2 3 1 2 3 9
输出样例1:
2

说明

【样例说明】:
Bessie先以1的速度跑了2单位时间,然后以4的速度跑了1单位时间,然后以1的速度跑了1单位时间,最后以2的速度跑了10单位时间。
Elsie先以2的速度跑了3单位时间,然后以1的速度跑了2单位时间,最后以3的速度跑了9单位时间。
在整个过程中,刚开始Elsie领先,在时间t=3时,两头奶牛相遇,此时都跑了6单位的总距离,然后并行的跑了1单位的时间,然后Bessie领先了(第一次领跑者改变),短暂的领先后又被Elsie赶超了(第二次领跑者改变),然后Elsie一直领先直到比赛结束。

所以比赛期间领跑者一共变化了2次,输出答案是2.

【耗时限制】1000ms 【内存限制】128MB

很显然,这一题是一道模拟题,所以可以根据样例说明来模拟代码,废话0

代码:

#include <iostream>
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
LL n,m,bt[1010000],tb=0,et[1010000],te=0,cnt=0,v,t;  //数组的大小要大于1e6
int main()
{
    cin>>n>>m;
    while(n--){                                      //记录每个时间点Bessie的位置
        cin>>v>>t;
        while(t--){                                  //枚举时间
            tb++;                                    //来到下一个时间点
            bt[tb]=bt[tb-1]+v;                       //现在的位置等于上个时间点的位置加速度
        }
    }
    while(m--){                                     //记录每个时间点Elsie的位置
        cin>>v>>t;
        while(t--){
            te++;
            et[te]=v+et[te-1];
        }
    }
    while(te<tb){                                  //补全Elsie缺少的时间点位置
        te++;                                      //来到下一个时间点
        et[te]=et[te-1];                           //因为不动了所以缺少的时间点都在最后位置
    }
    while(te>tb){                                  //补全Bessie缺少的时间点位置
        tb++;
        bt[tb]=bt[tb-1];
    }
    for(int i=2;i<=te;i++)                         //判断领先变化,开始时的领先不算,从2开始
        if(bt[i]>et[i]&&bt[i-1]<=et[i-1]) cnt++;   //Bessie的领先
        else if(bt[i]<et[i]&&bt[i-1]>=et[i-1]) cnt++;//Elsie的领先
    
    cout<<cnt;
    return 0;
}

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值