Kid Phantom 2024-05-02 20:10 采纳率: 45.5%
浏览 2
已结题

遥控赛车比赛(T3)

小A同学和小B同学的赛车从同一个起点出发,并且他们的总用时一样。我们用“片段”法记录赛车的前进过程,例如,小A的赛车以1的速度运行2个单位时间,然后以4的速度运行1个单位时间。
裁判员想知道,这两辆赛车交替成为第一名的次数。例如,如果一开始小B的车子领先,然后小A车子超越小B,那么这就是一次第一名位置的交替。如果一开始小B的车子领先,然后A与B一样快,并僵持一段时间,然后最终小A领先,那么这也就意味着第一名位置的交替,但是,如果直到比赛结束小A都没有取得领先,那么不算第一名位置的交替。
输入
第1行:两个整数用空格隔开,N和M(1<=N,M<=1000)
第2到1+N行:每一行包含一个小A的赛车跑的N段路程,由两个整数描述:第一个数表示速度和第二个数表示以该速度运行的时间(两个整数都在1到1000范围内)。
第2+N到1+N+M行:每一行包含一个小B的赛车跑的M段路程,由两个整数描述:第一个数表示速度和第二个数表示以该速度运行的时间(两个整数都在1到1000范围内)。
输出
一行:第一名位置的交替次数。
样例输入 Copy
4 3
1 2
4 1
1 1
2 10
2 3
1 2
3 9
样例输出 Copy
2
提示
输入说明:
小A的赛车以1的速度跑2单位的时间,然后以4的速度跑1单位的时间,然后以1的速度跑1单位的时间,最后以2的速度跑10单位的时间。
小B的赛车以2的速度运行3个单位的时间,然后以1的速度运行2个单位的时间,最后以3的速度运行9个单位的时间。
请注意,这两辆车的总用时一样,都是跑了14个单位的时间。
输出说明:
小B的赛车领先,直到时间t=3,当两辆赛车都经过了6个单位的距离后相遇,并一起跑了1个单位的时间。小A的赛车随后短暂领先(第一次第一名位置的交替),但不久t=7时就被小B的赛车超越(第二次第一名位置的交替)。最后小B的赛车赢得了比赛。

  • 写回答

4条回答 默认 最新

  • Kid Phantom 2024-05-02 20:30
    关注
    #include<bits/stdc++.h>
    #define MX 1000000
    #define NX 1000
    using namespace std;
    int s1[MX + 10] = {0},s2[MX + 10] = {0};
    int main()
    {
        int n,m,i,j,av[NX + 10],at[NX + 10],bv[NX + 10],bt[NX + 10],p = -1;
        cin >> n >> m;
        long long int cnt = 0,ans = 0,k1 = 1,t1 = 0,k2 = 1,t2 = 0;
        for (i = 1;i <= n;i++)
        {
            cin >> av[i] >> at[i];
        }
        for (i = 1;i <= m;i++)
        {
            cin >> bv[i] >> bt[i];
        }
        for (i = 1;i <= 1000000;i++)
        {
            if (k1 > n)
            {
                break;
            }
            s1[i] = s1[i - 1] + av[k1];
            t1++;
            if (t1 >= at[k1])
            {
                k1++;
                t1 = 0;
            }
        }
        for (i = 1;i <= 1000000;i++)
        {
            if (k2 > m)
            {
                break;
            }
            s2[i] = s2[i - 1] + bv[k2];
            t2++;
            if (t2 >= bt[k2])
            {
                k2++;
                t2 = 0;
            }
        }
        for (i = 1;i <= 1000000;i++)
        {
            if ((s1[i] > s2[i] && s1[i - 1] <= s2[i - 1]) || (s2[i] > s1[i] && s2[i - 1] <= s1[i - 1]))
            {
                ans++;
                if (p == -1)
                {
                    p = i;
                }
            }
        }
        if (p == 1)
        {
            cout << ans - 1 << endl;
        }
        else
        {
            cout << ans << endl;
        }
        return 0;
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 5月10日
  • 已采纳回答 5月2日
  • 创建了问题 5月2日

悬赏问题

  • ¥15 请教如何关于Msg文件解析
  • ¥200 sqlite3数据库设置用户名和密码
  • ¥15 AutoDL无法使用docker install吗?
  • ¥15 cups交叉编译后移植到tina sdk的t113,只需要实现usb驱动打印机,打印pdf文件
  • ¥30 关于#wireshark#的问题:需要网络应用流量数据集需要做长度序列的实验,需要与应用产生的会话的数据包的长度,如视频类或者聊天类软件
  • ¥15 根据上述描述表示泥浆密度沿着管路的长度方向在不断变化,如何来表示泥浆密度随管路的变化(标签-matlab|关键词-流计算)
  • ¥21 matlab可以把图像数据转换为小波分析吗
  • ¥60 基于香农编码的图像压缩算法实现
  • ¥15 matlabGUI绘制一个函数与其导数的图像
  • ¥20 大数据采集用Python爬取猫眼电影数据