Duang~Lucky.Mr.Li 2024-04-18 11:07 采纳率: 25%
浏览 9

阅览室问题,程序读取测试用例不理解


#include<iostream>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
char v[1010];
string time1[1010], time2[1010];
int num1[1010], sum1[1010];
int n;
int tom(string time)
{
    int h = (time[0] - '0') * 10 + (time[1] - '0') * 1;
    int m = (time[3] - '0') * 10 + (time[4] - '0') * 1;
    return h * 60 + m;
}
int f(string time1, string time2)
{
    return tom(time2) - tom(time1);
}
int main()
{
    cin >> n;
    int k = 1;
    int sum = 0;
    int num = 0;
    for (int i = 1; i <= n; i++)  //天数 
    {
        num = 0;
        sum = 0;
        while (true)
        {
            cin >> k;//书号 
            if (k == 0)
            {
                break;
            }
            cin >> v[k];//键值
            if (v[k] == 'S') cin >> time1[k];//开始时间
            if (v[k] == 'E')
            {
                cin >> time2[k];//结束时间
                if (!time1[k].empty())
                {
                    sum += f(time1[k], time2[k]);
                    num++;
                }
            }
        }
        //        cout<<sum<<" "<<num;
        if (sum % num != 0)
        {
            cout << num << " " << sum / num + 1 << endl;
        }
        else
        {
            cout << num << " " << sum / num << endl;
        }
    }
    return 0;
}

测试用例:
3
1 S 08:10
2 S 08:35
1 E 10:00
2 E 13:16
0 S 17:00
0 S 17:00
3 E 08:10
1 S 08:20
2 S 09:00
1 E 09:20
0 E 17:00
为什么测试用例的输入只能读取到第一个 0 S 17:00
下面的就无法继续读取了

  • 写回答

5条回答 默认 最新

  • 专家-赤兔[在线] 优质创作者: 编程框架技术领域 2024-04-18 11:07
    关注

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

    在分析您的代码和测试用例之后,我发现了一个可能的原因导致程序在遇到第一个0 S 17:00时停止读取后续输入。当您输入一个0表示没有更多的书籍操作时,程序会立即跳出内部循环并进入下一个天数的处理。但是,在这里,您应该等待用户输入另一个天数(例如3),然后才能继续执行。

    为了解决这个问题,我们需要对代码进行一些调整。具体来说,您应该在外部循环中检查是否读到了所有天数,而不是在内部循环结束后立即检查。以下是修改后的代码:

    #include<iostream>
    #include<cstring>
    #include<cmath>
    #include<algorithm>
    using namespace std;
    
    // ... 其他部分保持不变 ...
    
    int main()
    {
        cin >> n;
        bool more_days = true;
        
        while(more_days)
        {
            int k = 1;
            int sum = 0;
            int num = 0;
            
            for (int i = 1; i <= n; i++)
            {
                num = 0;
                sum = 0;
                
                while (true)
                {
                    cin >> k; // 书号
                    if (k == 0)
                    {
                        more_days = false;
                        break;
                    }
                    
                    cin >> v[k]; // 键值
                    if (v[k] == 'S') cin >> time1[k]; // 开始时间
                    if (v[k] == 'E')
                    {
                        cin >> time2[k]; // 结束时间
                        if (!time1[k].empty())
                        {
                            sum += f(time1[k], time2[k]);
                            num++;
                        }
                    }
                }
    
                // ... 原有的输出部分保持不变 ...
            }
        }
        
        return 0;
    }
    

    在这个版本的代码中,我们添加了一个布尔变量more_days,用于跟踪是否有更多的天数需要处理。当读到一个0表示没有更多书籍操作时,我们将more_days设为false,这样只有在more_daystrue时,才会继续读取下一个天数的操作。这样就可以确保程序可以正确地处理所有的测试用例了。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 4月18日