一笑照夜 2019-02-19 01:11 采纳率: 100%
浏览 498
已采纳

C++段错误的问题,题目为PAT甲级1095

找不到错了,求教,感觉没有数组越界,没有爆栈,可能是map的问题,刚开始用不太会,debug找不到错很绝望

题目是PAT甲级1095
代码如下

#include<stdio.h>
#include<cstdio>
#include<string>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<map>

using namespace std;

struct Car
{
    string plate_number;
    int time;
    int InorOut;
    int valid = 0;
}car[10010];

bool cmpcar(Car a, Car b)
{
    int s = a.plate_number.compare(b.plate_number);
    if (s != 0)
        return s < 0;
    else
        return a.time < b.time;
}

bool cmptime(Car a, Car b)
{
    if (a.valid != b.valid)
        return a.valid > b.valid;
    else
        return a.time < b.time;
}

int main()
{
    int N, K;
    scanf("%d %d", &N, &K);
    int i;
    for (i = 0; i < N; i++)
    {
        cin >> car[i].plate_number;
        int hh, mm, ss;
        scanf("%d:%d:%d", &hh, &mm, &ss);
        car[i].time = hh * 3600 + mm * 60 + ss;
        string ioo;
        cin >> ioo;
        if (ioo.compare("in") == 0)
            car[i].InorOut = 1;
        else
            car[i].InorOut = 0;
    }
    car[i].plate_number = "-1";

    sort(car, car + N, cmpcar);
    map<string, int> mp;
    map<string, int>::iterator it;
    int sumtime = 0;
    for (i = 0; i < N; i++)
    {
        if (car[i].plate_number.compare(car[i + 1].plate_number) == 0)
        {
            if (car[i].InorOut == 1 && car[i + 1].InorOut == 0)
            {
                sumtime = sumtime + car[i + 1].time - car[i].time;
                car[i].valid = 1;
                car[i + 1].valid = 1;
            }
        }
        else
        {
            mp[car[i].plate_number] = sumtime;
            sumtime=0;
        }
    }
    /////////////////////////////////////////////////////////////
    sort(car, car + N, cmptime);
    int k = 0;
    int carnum = 0;
    for (i = 0; i < K; i++)
    {
        int H, M, S;
        scanf("%d:%d:%d", &H, &M, &S);
        int Time = H * 3600 + M * 60 + S;
        while (car[k].time <= Time)
        {
            if (car[k].valid == 1)
            {
                if (car[k].InorOut == 1)
                    carnum++;
                else
                    carnum--;
            }
            k++;
        }
        printf("%d\n", carnum);
    }
    ////////////////////////////////////////////////////////////
    int maxnum = 0;
    int max = 0;
    for (it = mp.begin(); it != mp.end(); it++)
    {
        if (it->second > max)
            max = it->second;
    }
    for (it = mp.begin(); it != mp.end(); it++)
    {
        if (it->second == max)
            cout << it->first << " ";
    }
    printf("%02d:%02d:%02d", max / 3600, max % 3600 / 60, max % 60);
}

测试点1和2一直报段错误

  • 写回答

2条回答 默认 最新

  • 一笑照夜 2019-02-19 15:12
    关注

    找到错误了,将map定义放在main外即可,猜测是由于数据太多,而map是在main分配的堆栈中导致爆栈

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

报告相同问题?

悬赏问题

  • ¥40 复杂的限制性的商函数处理
  • ¥15 程序不包含适用于入口点的静态Main方法
  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码