自我介绍就免了吧,大家也看得见我的名字。
今天讲讲如何更好的使用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++)
- __int64不是ANSI标准定义,只能在MSVC编译器使用,在 GNU C++ 中应写成 long long 类型, scanf和printf 请使用%lld作为格式(黄楚钊的解释:__int64是微软给他加上的,原版C+++没有。scanf和printf别用%d,要用%lld(long long整型)(没学过C,应该是这样吧))
- main() 返回值必须定义为 int ,而不是 void(黄楚钊的解释:不能用void main(),然后省略return 0;)
- i 在循环外失去定义 “for(int i=0…){…}”(黄楚钊的解释:for循环的第一个条件的变量是局部的,循环过了之后不能用)
- itoa 不是ansi标准函数(标准 C/C++ 中无此函数)