鱼C论坛

 找回密码
 立即注册
查看: 2614|回复: 9

[已解决]提问:这,我没超时啊?

[复制链接]
发表于 2022-10-4 11:21:02 | 显示全部楼层 |阅读模式
10鱼币
本帖最后由 高山 于 2022-10-4 11:22 编辑

我用c++编了个程序,结果说超时
题目如下:
高桥做了一道信息题。做的过程中他提交了n次,评测结果有AC WA TLE RE 。输入他这n次提交的结果,请你帮他算一算:每种评测结果各出现了多少次?
样例输入及输出:
6
AC
TLE
AC
AC
WA
TLE
AC x 3
WA x 1
TLE x 2
RE x 0
我的代码是:
#include<iostream>
#include<string>
using namespace std;
int main()
{
        int n,AC=0,WA=0,TLE=0,RE=0;
        cin>>n;
        string at[999];
        for(int i=0;i<n;i++)
        {
                cin>>at[i];
        }
        for(int i=0;i<n;i++)
        {
                if(at[i]=="AC") AC++;
                if(at[i]=="WA") WA++;
                if(at[i]=="TLE") TLE++;
                if(at[i]=="RE") RE++;
        }
        cout<<"AC x "<<AC<<endl;
        cout<<"WA x "<<WA<<endl;
        cout<<"TLE x "<<TLE<<endl;
        cout<<"RE x "<<RE<<endl;
        return 0;
}
结果说超时:
超时.png
但我看c++编译器上写没超过限定时间
限定时间:2秒
最佳答案
2022-10-4 11:21:03
我感觉string at[999]不是申请999个string类型的变量,而是申请一个长度为999的string变量,所以有可能溢出(溢出好像也是会RE的)
这个是我的代码,AC了
#include<iostream>
#include<cstring>
using namespace std;
int main() {
        int n, ac, wa, tle, re;
        ac = wa = tle = re = 0;
        cin>>n;
        for(int i=0; i<n; ++i) {
                string x; cin>>x;
                if(x == "AC") ac++;
                if(x == "WA") wa++;
                if(x == "TLE") tle++;
                if(x == "RE") re++; 
        }
        cout<<"AC x "<<ac<<endl;
        cout<<"WA x "<<wa<<endl;
        cout<<"TLE x "<<tle<<endl;
        cout<<"RE x "<<re<<endl;
        return 0;
}

最佳答案

查看完整内容

我感觉string at[999]不是申请999个string类型的变量,而是申请一个长度为999的string变量,所以有可能溢出(溢出好像也是会RE的) 这个是我的代码,AC了

评分

参与人数 1荣誉 +1 收起 理由
zhangjinxuan + 1

查看全部评分

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-10-4 11:21:03 | 显示全部楼层    本楼为最佳答案   
我感觉string at[999]不是申请999个string类型的变量,而是申请一个长度为999的string变量,所以有可能溢出(溢出好像也是会RE的)
这个是我的代码,AC了
#include<iostream>
#include<cstring>
using namespace std;
int main() {
        int n, ac, wa, tle, re;
        ac = wa = tle = re = 0;
        cin>>n;
        for(int i=0; i<n; ++i) {
                string x; cin>>x;
                if(x == "AC") ac++;
                if(x == "WA") wa++;
                if(x == "TLE") tle++;
                if(x == "RE") re++; 
        }
        cout<<"AC x "<<ac<<endl;
        cout<<"WA x "<<wa<<endl;
        cout<<"TLE x "<<tle<<endl;
        cout<<"RE x "<<re<<endl;
        return 0;
}

评分

参与人数 1鱼币 +5 收起 理由
高山 + 5 运行通过!感谢~

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-10-4 11:21:53 | 显示全部楼层
本帖最后由 高山 于 2022-10-4 11:33 编辑


点此 pn_reply.png
测试链接:https://atcoder.jp/contests/abc173/tasks/abc173_b
测试提交链接:https://atcoder.jp/contests/abc173/submit?taskScreenName=abc173_b
@zhangjinxuan

评分

参与人数 1鱼币 +2 收起 理由
zhangjinxuan + 2

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-10-7 12:12:59 | 显示全部楼层
本帖最后由 zhangjinxuan 于 2022-10-8 19:19 编辑



注意N的数据范围:1 ≤ N ≤ 10 ^ 5

你的string数组只开999,10的五次方能装得下就怪了

解决方案:
string at[100001]; //我喜欢用1...base,所以开100001

其实完全没有必要开一个string数组,可以这样子:
#include <cstdio>

using namespace std;

int ac, wa, tle,re;

int main() {
        char s[3];
        int n;
        scanf("%d", &n);
        while (n--) {
                scanf("%s", s);
                switch (s[0]) {
                        case 'A':
                                ++ac;
                                break;
                        case 'W':
                                ++wa;
                                break;
                        case 'T':
                                ++tle;
                                break;
                        case 'R':
                                ++re;
                                break;
                }
        }
        printf("AC x %d\nWA x %d\nTLE x %d\nRE x %d", as, wa, tle, re);
}

另外,RE是运行时错误,意思是运行时发生了一些很奇怪的错误,常见的错误有:栈溢出,访问不能读写的内存(数组溢出),除零,缓冲区溢出,assert失败等等

TLE才是超时哦

@高山 我认为这才是正解
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-10-7 12:15:20 | 显示全部楼层
tommyyu 发表于 2022-10-4 11:21
我感觉string at[999]不是申请999个string类型的变量,而是申请一个长度为999的string变量,所以有可能溢出 ...

不对不对,string at[999]就是999个string变量

你想一想,n的数据范围在100000以下,at[100000]肯定会访问非法内存

溢出的原因不是长度不够,而是数组空间不够

楼上有详细一点的讲解
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-10-7 12:18:56 | 显示全部楼层
本帖最后由 zhangjinxuan 于 2022-10-7 12:23 编辑

还有,楼主,自己没有超时不代表不会超时哦,样例数据可是不能和真正测试数据比较的

多刷刷OJ吧,涨涨经验,我们学C++就是为了刷OJ,打竞赛的

我还发现我和高山的代码风格完全不一样
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-10-7 16:21:24 | 显示全部楼层
本帖最后由 陈尚涵 于 2022-10-7 16:22 编辑

哪个OJ给2秒时间?这么长吗?赞同楼上,要经常刷OJ,lz不要刷奇奇怪怪的网站了,推荐洛谷、力扣,我学C++主要是兴趣,但也要打竞赛。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-10-8 19:18:29 | 显示全部楼层
陈尚涵 发表于 2022-10-7 16:21
哪个OJ给2秒时间?这么长吗?赞同楼上,要经常刷OJ,lz不要刷奇奇怪怪的网站了,推荐洛谷、力扣,我学C++主 ...

这是Atcoder,日本的比赛,老师推荐我们去刷,我也经常刷。

至于为什么是2秒....我也无法解答
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-10-8 19:43:40 | 显示全部楼层
zhangjinxuan 发表于 2022-10-8 19:18
这是Atcoder,日本的比赛,老师推荐我们去刷,我也经常刷。

至于为什么是2秒....我也无法解答

额没见过这个网站
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-10-8 19:43:58 | 显示全部楼层
陈尚涵 发表于 2022-10-8 19:43
额没见过这个网站

beeeeeeeeeeeeeeep
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-8 01:24

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表