oj运行时错误_【算法学习】1.关于在线评测系统(OJ)

一、单点测试与多点测试

测试样例
题目中给出的测试样例一般都是非常简单的实例,仅凭样例难以测出程序的完整性能。但是,OJ系统后台有着大量的测试数据,其中不乏包含一些极限情况,比如一些特殊情况(比如数据小于0等),考查编程者的思维完整度;还有超大数据(指规模n很大的测试数据),考查程序的时间复杂度等等。因此,通过简单的样例并不意味着此题能得满分,样例只是一个示范。

单点测试
后台的测试数据是放在一个数据文件中的,其中有n组不同的测试数据。单点测试就是,要求代码只需要处理一组数据输入即可,OJ系统通过n次运行该代码实现对n组数据的测试。PAT采用单点测试。

多点测试
要求代码能循环处理完所有的测试数据。即OJ系统只运行一次代码实现对n组数据的测试。CSP、codeup都采用多点测试。

如何实现符合多点测试要求的程序

  • 数据读入
    多点测试系统下的题目分为以下几种类型:
    (1)题目没有指定数据输入结束条件:这种情况下默认条件为读取到数据文件末尾(后台的测试数据是放在一个数据文件中的)。
    解决策略:while…!=EOF 型代码
    //一次读入一个数,直到文件末尾(到文件末尾时scanf会读入失败并返回EOF)

while(scanf("%d",&n)!=EOF){...}
//一次读入一个字符串,直到文件末尾
while(scanf("%s",str)!=EOF){...}
while(gets(str)!=NULL){...}
控制台输入时手动触发EOF(触发scanf读入失败):Ctrl+Z


(2)题目指定当满足某个条件时,数据输入结束:
解决策略:while…!=EOF{ if…break; } 型代码
while(scanf("%d",&n)!=EOF){
if(...)
break;

(3)题目在给出测试数据之前指定测试数据的组数T
解决策略:while(T--) 型代码
int T;
scanf("%d",&T);
while(T--){...}

  • 数据输出

分为以下几种类型:
(1)每两组输出数据之间没有额外空行(常规)
(2)每组输出数据之后跟一个额外空行
(3)每组输出数据之后跟一个额外空行,最后一组数据后不跟空行
int T;
scanf("%d",&T);
while(T--){
...
if(T>0)
printf("n");

(4)只输出一行数据,包括N个整数,每两个整数间空格隔开,最后一个整数后不加空格
for(int i=0;i<N;i++){
printf("%d",a[i]);
if(i=N-1){
printf("n");
}
else
printf("");

  • 数据循环

每次数据循环后,都要重置一遍循环变量、数组等,避免上组测试数据对下组测试数据造成未知的影响。
重置数组:memset、fill等函数非常好用。

二、数据规模与复杂度

int 与 long long

  • 数据绝对值介于1~10^9 :int型
  • 10^9~10^18 :long long型

float 与 double

  • 一律使用double,float经常精度不足。

现代计算机的计算能力与时间复杂度
1s能完成的运算次数是10^7~10^8。对于规模n=1000的数据,以及采用O(n^2)的算法,则产生的运算次数为10^6级别,在可承受范围之内。但若改为n=10000的数据,则必须将复杂度降到O(n)或以下,否则程序评测时必定产生超时错误。
空间复杂度
不能开数个10^7以上的数组空间,一般情况下10^6的数组空间就足够用了。对于较大的数组(10^4及以上的数组)都要放到全局空间中开辟,不能放到主函数或其他函数中开辟,否则将发生爆栈错误。

三、语言与文件

保存为C++的.cpp文件,并选择C++/G++编译器提交。

四、常见评测结果

(1)Accepted 正确通过
(2)Compile Error 编译错误(选错语言/头文件/语法等)
(3)Runtime Error 运行时错误:内存非法访问(指针指向非法内存区,数组越界等)、递归爆栈、浮点运算错误(除数为0,模数为0)
(4)Wrong Answer 答案错误:程序逻辑问题、多输出了调试信息
(5)Presentation Error 格式错误:已经极为接近Accepted,一般是多输出了换行或空格符
(6)Time Limit Exceeded 运行超时:检查数据规模与时间复杂度
(7)Memory Limit Exceeded 内存超限:不能在函数内部开过大的局部数组,大数组应在全局区开辟
(8)Output Limit Exceeded 输出超限:死循环输出过多内容

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值