OJ的几点注意事项

TheSecondBlock

管理成员
版主
成员
UID
6
注册
2024-01-28
消息
3
金粒
金粒331粒
钻石
钻石0颗
嗨币
嗨币0元
自我介绍就免了吧,大家也看得见我的名字。
今天讲讲如何更好的使用OJ,避免你”怀才不Accepted

1.Wrong Answer 的判定​

某些人就很奇怪啊,为啥我明明对了,他还是Wrong Answer呢?
首先,我们来看这段代码:
(P1007 A+B)

#include<iostream>
using namespace std;
int main()
{
int a,b;
cout << "请输入第一个数和第二个数,用空格隔开:";
cin >> a >> b;
cout << a + b;
return 0;
}








需要注意的是,这段代码让OJ来看,是错误的。为什么呢?因为OJ他的解析器(?)是不需要你提示他的。毕竟他也不是ChatGPT,看不懂你的提示词。他只会把你的输出和正确的输出进行对比。如果你不懂我在说啥,可以去GitHub看看HCode OJ的源码
所以,我们要改成这样:

#include<iostream>
using namespace std;
int main()
{
int a,b;
cin >> a >> b;
cout << a + b;
return 0;
}








2. XXX Limit Exceeded 的判定​

我们可能会在编写过程中,遇到Time Limit Exceeded或者Memory Limit Exceeded的错误。这是为什么呢?字面意义上来看,Time Limit Exceeded 就是程序运行时间已超出题目限制,Memory Limit Exceeded 就是程序实际使用的内存已超出题目限制。那限制在哪里呢?我们写题目的时候,可以看到左上角的时间限制和内置限制。比如,这是P1007 A+B的限制:

时间限制:C/C++ 1000MS,其他语言 2000MS
内存限制:C/C++ 32MB,其他语言 64MB








那么如果我们是用C/C++编写的,时间就只能在1000毫秒里面,且内存只能用32兆。其他语言同理。

3. Compile Error 的判定​

Compile Error一般是因为报错了,编译不了。
比如我这样写:

#include<iostream>
using namespace std;
int main()
{
int a,b;
cin >> a >> b;
cout << a + b // 这里少个分号
return 0;
}








那么我如果提交,就会提示Compile Error。这时候你可以点一下下面的Compile Error,就会跳转到提交详情。这里就可以看到报错信息了。比如我的就是:

main.cpp: In function 'int main()':
main.cpp:7:18: error: expected ';' before 'return'
7 | cout << a + b // 这里少个分号
| ^
| ;
8 | return 0;
| ~~~~~~








这时候,你就需要百度搜报错内容找解决办法,或者在本地进行debug

4. Runtime Error 的判定​

Runtime Error一般是因为你没有正常退出程序。比如说我这样子写:

#include<iostream>
using namespace std;
int main()
{
int a,b;
cin >> a >> b;
cout << a + b;
return 1; // 注意这里,我return的不是0,而是1
}








那么虽然我的程序正确执行了,但是因为返回值是1,编译器就会抛出这个错误:

Runtime Error
运行时间1ms
运行内存260KB
ExitCode: 1 (Hangup)








当然,有时候一些其他的错误也会触发这个Error,那只能百度自己的退出码了

5.Presentation Error 的判定​

这个Error是表明很接近正确答案,这时候就要检查代码格式输出是否有多余空格,换行等空白符。

6.Partial Accepted 的判定​

这个是因为代码通过了多数判定点,但有些没通过。这时候就要看看代码是不是有些不足,比如…多来几个else if?

7.其他​

(复制至 Introduction – 高途编程 C++)

  1. __int64不是ANSI标准定义,只能在MSVC编译器使用,在 GNU C++ 中应写成 long long 类型, scanf和printf 请使用%lld作为格式(黄楚钊的解释:__int64是微软给他加上的,原版C+++没有。scanf和printf别用%d,要用%lld(long long整型)(没学过C,应该是这样吧))
  2. main() 返回值必须定义为 int ,而不是 void(黄楚钊的解释:不能用void main(),然后省略return 0;)
  3. i 在循环外失去定义 “for(int i=0…){…}”(黄楚钊的解释:for循环的第一个条件的变量是局部的,循环过了之后不能用)
  4. itoa 不是ansi标准函数(标准 C/C++ 中无此函数)
 
提示 有插入代码的按钮呢
1709117255077.webp
 
后退
顶部 底部