高山 发表于 2022-10-4 11:21:02

提问:这,我没超时啊?

本帖最后由 高山 于 2022-10-4 11:22 编辑

我用c++编了个程序,结果说超时
题目如下:
高桥做了一道信息题。做的过程中他提交了n次,评测结果有AC WA TLE RE 。输入他这n次提交的结果,请你帮他算一算:每种评测结果各出现了多少次?
样例输入及输出:
6
AC
TLE
AC
AC
WA
TLEAC 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;
      for(int i=0;i<n;i++)
      {
                cin>>at;
      }
      for(int i=0;i<n;i++)
      {
                if(at=="AC") AC++;
                if(at=="WA") WA++;
                if(at=="TLE") TLE++;
                if(at=="RE") RE++;
      }
      cout<<"AC x "<<AC<<endl;
      cout<<"WA x "<<WA<<endl;
      cout<<"TLE x "<<TLE<<endl;
      cout<<"RE x "<<RE<<endl;
      return 0;
}
结果说超时:

但我看c++编译器上写没超过限定时间
限定时间:2秒

tommyyu 发表于 2022-10-4 11:21:03

我感觉string at不是申请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;
}

高山 发表于 2022-10-4 11:21:53

本帖最后由 高山 于 2022-10-4 11:33 编辑


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

zhangjinxuan 发表于 2022-10-7 12:12:59

本帖最后由 zhangjinxuan 于 2022-10-8 19:19 编辑



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

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

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

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

using namespace std;

int ac, wa, tle,re;

int main() {
        char s;
        int n;
        scanf("%d", &n);
        while (n--) {
                scanf("%s", s);
                switch (s) {
                        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才是超时哦

@高山 我认为这才是正解

zhangjinxuan 发表于 2022-10-7 12:15:20

tommyyu 发表于 2022-10-4 11:21
我感觉string at不是申请999个string类型的变量,而是申请一个长度为999的string变量,所以有可能溢出 ...

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

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

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

楼上有详细一点的讲解

zhangjinxuan 发表于 2022-10-7 12:18:56

本帖最后由 zhangjinxuan 于 2022-10-7 12:23 编辑

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

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

我还发现我和高山的代码风格完全不一样{:5_109:}

陈尚涵 发表于 2022-10-7 16:21:24

本帖最后由 陈尚涵 于 2022-10-7 16:22 编辑

哪个OJ给2秒时间?这么长吗?赞同楼上,要经常刷OJ,lz不要刷奇奇怪怪的网站了,推荐洛谷、力扣,我学C++主要是兴趣,但也要打竞赛。

zhangjinxuan 发表于 2022-10-8 19:18:29

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

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

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

陈尚涵 发表于 2022-10-8 19:43:40

zhangjinxuan 发表于 2022-10-8 19:18
这是Atcoder,日本的比赛,老师推荐我们去刷,我也经常刷。

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

额没见过这个网站

zhangjinxuan 发表于 2022-10-8 19:43:58

陈尚涵 发表于 2022-10-8 19:43
额没见过这个网站

beeeeeeeeeeeeeeep
页: [1]
查看完整版本: 提问:这,我没超时啊?