Kid Phantom 2024-05-02 19:56 采纳率: 45.5%
浏览 3
已结题

水题错误原因(急)!

小A同学和小B同学的赛车从同一个起点出发,并且他们的总用时一样。我们用“片段”法记录赛车的前进过程,例如,小A的赛车以1的速度运行2个单位时间,然后以4的速度运行1个单位时间。
裁判员想知道,这两辆赛车交替成为第一名的次数。例如,如果一开始小B的车子领先,然后小A车子超越小B,那么这就是一次第一名位置的交替。如果一开始小B的车子领先,然后A与B一样快,并僵持一段时间,然后最终小A领先,那么这也就意味着第一名位置的交替,但是,如果直到比赛结束小A都没有取得领先,那么不算第一名位置的交替。

错误代码:


#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;
}

```

  • 写回答

2条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-05-02 19:59
    关注

    引自免费微信小程序:皆我百晓生

    在分析这段代码之前,让我们先理清思路。这是一个关于两辆赛车交替领先的计数问题。给定每辆车在不同时间段内的速度和持续时间,我们需要计算这两辆车交替成为第一名的次数。代码的主要逻辑是通过两个循环分别计算两辆车在每个时间点的位置,然后遍历这些位置,判断是否有交替领先的情况发生。

    问题出在以下几点:

    1. 定义了数组s1s2的最大长度为1000000,但实际可能不需要这么大的空间,可能导致不必要的计算和内存消耗。
    2. 最后输出的答案减去1(ans - 1),这个操作没有明确的理由。如果没有考虑到特殊情况,可能会导致答案不正确。

    修正后的代码如下:

    #include <iostream>
    #include <vector>
    using namespace std;
    
    int main() {
        int n, m, i, j;
        cin >> n >> m;
    
        vector<int> av(n + 1), at(n + 1);
        vector<int> bv(m + 1), bt(m + 1);
    
        // 输入赛车A的数据
        for (i = 1; i <= n; i++) {
            cin >> av[i] >> at[i];
        }
    
        // 输入赛车B的数据
        for (i = 1; i <= m; i++) {
            cin >> bv[i] >> bt[i];
        }
    
        int s1 = 0, s2 = 0;
        int k1 = 1, t1 = 0, k2 = 1, t2 = 0;
        int ans = 0;
    
        while (true) {
            // 更新赛车A的位置
            s1 += av[k1];
            t1++;
    
            // 判断是否完成当前速度段
            if (t1 >= at[k1]) {
                k1++;
                t1 = 0;
            }
    
            // 更新赛车B的位置
            s2 += bv[k2];
            t2++;
    
            // 判断是否完成当前速度段
            if (t2 >= bt[k2]) {
                k2++;
                t2 = 0;
            }
    
            // 检查是否发生了交替领先
            if ((s1 > s2 && s1 - av[k1] <= s2) || (s2 > s1 && s2 - bv[k2] <= s1)) {
                ans++;
            }
    
            // 如果所有速度段都已完成,则跳出循环
            if (k1 > n && k2 > m) {
                break;
            }
        }
    
        cout << ans << endl;
        return 0;
    }
    

    主要修改的地方:

    • 删除了对最大长度为1000000的数组定义,改为动态更新赛车位置。
    • 移除了最后减去1的操作,因为这里我们已经正确地计算了每一次交替领先的情况。

    现在这个代码应该可以正确处理这个问题。注意,输入数据要确保合法,即不会有多余的时间段,赛车A和赛车B的总行驶时间相等。如果有特殊情况,比如总时间不等或者有额外的要求,请提供更多信息以便进行调整。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 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爬取猫眼电影数据