Kid Phantom 2024-05-02 20:03 采纳率: 45.5%
浏览 0

一道小学组找错(急)

题目描述
小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的赛车赢得了比赛。

错误代码:

#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];
    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++;
        }
    }
    cout << ans - 1 << endl;
    return 0;
}

```c++


```

  • 写回答

4条回答 默认 最新

  • 码农阿豪 Java领域优质创作者 2024-05-02 20:14
    关注
    让阿豪来帮你解答,本回答参考chatgpt3.5编写提供,如果还有疑问可以评论或留言
    一、问题分析 题目描述 这个问题可以用很多种语言来描述。在程序设计中,问题描述就是用自然语言描述问题。根据题面,可以将其分为如下的步骤: 输入两个整数N和M,表示两个人跑步的步数。 输入每个人的跑步的速度和时间。 根据输入的信息,先计算出每个人跑路程所用的时间。 然后两个人对比,哪个人先到达1km,即为第一位置。 如果换一位后,距离1km更近,这就是一个可计数的第一名位置的交替,即选手之间位置的交替多于一次。 问题分析 基于这些步骤,我们可以分为以下几个部分进行解答: 输入N和M,以及其他数据。 计算每个人跑路程所用的时间。 遍历计算结果,数出跑得最快的人。 根据规则数出第一名位置的交替。 这些步骤其实是接续的,交替的。接下来分别解答。 二、解题思路 输入N和M,以及其他数据 这个步骤较为简单。从控制台输入N和M的值,然后紧接着输入相关的数值。 计算每个人跑路程所用的时间 我们可以模拟每个跑步者的行进过程,对每个人都计算一下每一秒所跑的路程,然后再统计所用时间。这可以通过如下代码实现: // 声明变量 int av[NX + 10], at[NX + 10], bv[NX + 10], bt[NX + 10]; s1[MX + 10] = {0}, s2[MX + 10] = {0}, k1 = 1, t1 = 0, k2 = 1, t2 = 0, n, m; ... // 计算人A的跑步路程 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;
    }
    

    } // 计算人B的跑步路程 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; } } 此处需要注意的是,由于我们并不知道跑的时间,舍弃空间大小,所以余量需要设置大一些,至少是两人赛跑过程的时间总和。 遍历计算结果,数出第一名的交替次数 这个步骤相对较难。实际上,我们没有办法直接获取第一名的位置,因为两个人的速度是不同的。 因此,解决这个问题的一种较优策略是把两人的跑步路程投影到时间轴上。即,假设AB两人分别在1km处,他们的路程可以被看作两条运动直线,相交处就是两人的相遇点。 具体来说,所谓“相交”指的是,如果两人路程没有重合,则两人路程中的较慢者会在时间轴上“超过”另一者,这时便可以计数。 以上策略实现起来比较困难,需要用到多重循环。具体规则为: 若$A_0,B_0$表示A和B开始位置,$A_n,B_m$表示A和B最后位置,$s_A[i]$表示A在$i$时刻前走过的路程,$s_B[i]$表示B在$i$时刻前走过的路程,则第$i$个时间点中,$A$和$B$的位置比较结果如下: - 若$s_A[i] < s_B[i]$并且$s_A[i-1] ≥ s_B[i-1]$,则$B$超过$A$。 - 若$s_A[i] > s_B[i]$并且$s_A[i-1] ≤ s_B[i-1]$,则$A$超过$B$。 - 其他情况不计数。 代码如下: //计算链表节点的数值 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++; } } 三、完整代码 - C++ 下面是纯 C++ 代码,实现输入部分、计算部分和计数部分。 #include <bits/stdc++.h> #define MX 1000000 #define NX 1000 using namespace std; int s1[MX + 10] = {0}, s2[MX + 10] = {0}, k1 = 1, t1 = 0, k2 = 1, t2 = 0, n, m; int main() { int av[NX + 10], at[NX + 10], bv[NX + 10], bt[NX + 10]; long long int cnt = 0, ans = 0; // 输入数据 cin >> n >> m; for (int i = 1; i <= n; i++) { cin >> av[i] >> at[i]; } for (int i = 1; i <= m; i++) { cin >> bv[i] >> bt[i]; } // 计算路程 for (int 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 (int 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 (int 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++; } } // 输出 cout << ans - 1 << endl; //输出第一名位置的交替次数,减去赛前两个人位置相同的特殊情况 return 0; }

    评论

报告相同问题?

问题事件

  • 创建了问题 5月2日

悬赏问题

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