持续更新ing...

* 自用,请勿搬运or转载,分享随意 *
* 这里是一只小小小小小白第一次发帖,求勿杠求轻喷qvq *
* 欢迎dalao们纠错 *

写在最前面:在你向任何人求助之前,请一定要认真阅读这一篇==>How To Ask Questions The Smart WayHow To Ask Questions The Smart Way 简体中文版关于如何提问的一张思维导图 - 0xFFFF




Ⅰ. 关于OJ里面各种常见的评测状态和出现的原因(这里只列出了新手期一般出现的原因)

洛谷常见评测状态(截图自洛谷的帮助说明帖)

AC: Accepted(答案正确)

恭喜你的代码通过了全部的测试点( ̄▽ ̄)* 太优秀啦///

CE: Compile Error(编译错误)

  • 语法错误

    1. 标点符号写成了全角
      【所!有!的!标点符号!一定要写半角/英文标点!】
    2. 分号等关键标点符号漏写
    3. 括号不匹配
    4. 语句不规范
      【比如for】
    5. 应用函数时没有include相应的头文件
    6. 函数的命名与头文件中已有的函数重复
    7. “%”前的数为非整数
      【%前后的数一定要是整数!!】
    8. ……
  • 编译不报错但需要重视的情况:“==”写成“=”;if或者for等后面的多个语句没有用花括号括起来……

  • 一个比较奇怪的CE:数组申请的内存过大(即长度过长)
    这是我上次在SCNU-N的热身赛时真实碰到的最匪夷所思的CE(。),在G题定义了一个全局变量的数组,长度有0x3fffffff,然后交上domjudge就报错CE了 TAT (在搜索引擎没搜索到有用信息,推测是domjudge或者评测机不能申请到这么大内存的问题)

p.s. 一般来说数组作为局部变量时最长的长度:int数组的最大范围是500000(估计)、char类型的最大范围是2000000;全局变量则可以定义更长的数组。(详情见对于c++中数组的最大长度的理解 - 二十四桥明月夜的博客

WA: Wrong Answer(答案错误)

  • 逻辑错误:一定要仔细读题,正确理解题意,可能会出现理解错误的问题或者有些情况没考虑到(比如洛谷P1426 小鱼会有危险吗里面,如果先游再if判断的话,很容易就漏考虑了小鱼一开始就有危险的情况)。
  • 粗心错误:
    1. 注意数据范围
      【比如有没有必要用到long long】。
    2. 数组长度的设置。
    3. 留意各种特殊值可能存在的特殊处理
      【比如0、1、负数、边界值】。
    4. 数据的初始化
      【比如sum、cnt、bool类型的、数组。总之一定要养成给 除了自己能够左右的变量的值以外的其他数据 初始化的习惯】。
    5. 运算符优先级
      【比如闰年的判断:!year%4 和 !(year%4) 的问题(笑】

RE: Runtime Error(运行时错误)

  • 数组越界【数组范围为0<=i<=n-1】(缓冲区溢出)
  • 运行过程中出现了除以零或者%0的情况(算术溢出)

TLE: Time Limited Error(超出时间限制)

  • 死循环
  • 递归深度过大(更容易报TLE的错而不是MLE的)
  • 算法不够优化
    【一个小建议:觉得自己算法不够简洁或者代码不够优雅的话,除了系统地学习算法以外,还可以阅读别人的优秀代码,说不定读着读着就恍然大悟了呢
  • 卡常
    【OI题目里面经常会出现的玄学卡常小汇总,粗略地讲原因都是因为快的那个更接近硬件底层罢辽。(这里的“快”指的是效率更高)】
    scanf("%d",&n); //比cin>>n;快
    printf("%d",n); //比cout<<n;快
    cnt+=2; //比cnt=cnt+2;快
    ++i; //比i++;快
    max=a>b? a:b; //三目运算符比if-else快
    char str[10]; //比string str;快
    num>>=1; //比num/=2;快
    最后那行代码属于位运算的内容,还有好多类似操作,详情见位运算 - OI Wiki

MLE: Memory Limited Error(超出内存限制)

  • 死循环(不断申请内存)
  • 单个数组过大或定义了过多数组

PE: Presentation Error(格式错误)

【最近进行的SCNU-N热身赛里面的D题就是典型例子,很多人因为冒号后面漏了个空格而陷入WA的debug中XD(正式ACM赛里面会有这个报错)。一个取巧的方法就是可以拿鼠标光标去选一下Sample输出,看看里面哪个地方藏了括号之类的。】

  • 全/半角
  • 空格
  • 回车
  • 字母大小写

Ⅱ. 码风

强烈安利这个视频[av3929318](和这个视频的up主!)->【原创教程】代码规范_哔哩哔哩 (゜-゜)つロ 干杯-bilibili 不要求都按视频里的来啦,完全可以看个人喜好的www 但最重要就是要整齐和统一。

最最基本的排版要求:至少你同一层的代码缩进得相同吧√

For example:

//第一层
bool isPrime(int num){
	//第二层
	for(int i=2;i<=sqrt(num);i++){
        //第三层
		if(num%i==0){
            //第四层
			++cnt;
			return 0;
		}
	}
	return 1;
}

变量命名方法(不要再用abcdef啦!)

1. 匈牙利命名法:iCount,iSum,cName
2. 驼峰式命名法(Camel-Case):stuName, StuName
3. 下划线命名法:student_name


Ⅲ. 应该要拿个小本本记下来的东西

讲真学C++的时候要记的东西真的不多,但有些东西记住了真的很有用↓

常用头文件及函数

#include <cmath>
    abs(num);
    sqrt(num);
    pow(num);
#include <cstdio>
    scanf("%d",&num);
    printf("%d",num);
#include <iomanip> //精度控制
    cout<<setiosflags(ios::fixed)<<setprecision(2)<<num;
#include <algorithm> //偷懒专用库(初学者不建议使用
    sort(num,num+n); //把num[]从小到大排列
    swap(a,b); //交换a和b
    max(a,b); //返回a,b的较大值
    min(a,b); //返回a,b的较小值
#include <cstring> //操作char数组
    char str[100];
    int len=strlen(str); //返回字符串长度
    strcat(str1,str2); //把str2连接到str1后面
    strcpy(str1,str2); //即str1=str2
    cout<<strcmp(str1,str2); //返回两字符串左起第一个不相同的字符的ASCII码的差值
    cout<<strlwr(str); //把str的全部字母转化成小写字母并输出
    cout<<strupr(str); //把str的全部字母转化成大写字母并输出
    memset(num,0,sizeof(num));
    //memset可用于初始化数组(这里把num[]初始化为0),但是以字节为单位的(第三个参数)。一般初始化为0或-1(二进制补码都为0或1)。另外也可以以0x3f来初始化数组,表示无穷。
#include <bits/stdc++.h> //万能头文件,包含了常用的一大堆库,但目前有些OJ或比赛不支持,慎用

ASCII码

ASCII表(来自百度百科)
没必要全部都记,但总要记些特别的。比如:小写字母=大写字母+32以及AZ、09和az的相对位置(谁在前谁在后)。

常用数据类型的范围

1. int 4bytes(32位,大概2.1e10)
2. long long 8bytes(64位,大概4.2e10)
3. double 8bytes(64位)

各种数据类型的字节数

格式控制符

%d -> int
%o -> 以八进制形式输出
%x -> 以十六进制形式输出
%lld -> long long
%lf -> double
%c -> 单个字符
%s -> 字符串

Ⅳ. 关于DEBUG

静态查错

简而言之,就是你一直登着你的WA代码,说不定瞪着瞪着就发现哪里有问题了呢_

反正就是逐条语句分析,必要的时候可以拿起手边的草稿纸,手算模拟一波。

↓比如这是上面提到的P1426 小鱼会有危险吗的WA代码,无奖竞猜错误在哪x_x。

#include<iostream>
using namespace std;
int main(){
    int sum=0,s,x;
    cin>>s>>x;
    for(int i=7;;i*=0.98){
        sum+=i;
        if(sum>=s-x){
            if(sum+i*0.98>s+x) cout<<"n"<<endl;
            else cout<<"y"<<endl;
            break;
        }
    }
    return 0;
}

输出查错

一个我最喜欢用的方法kkkkk 一言以蔽之就是——输出关键值或者关键位置某个变量的值的状态。

比如上面那份代码:

#include<iostream>
using namespace std;
int main(){
    int sum=0,s,x;
    cin>>s>>x;
    for(int i=7;;i*=0.98){
        sum+=i;
        if(sum>=s-x){
            if(sum+i*0.98>s+x) cout<<"n"<<endl;
            else cout<<"y"<<endl;
            break;
        }
    }
    return 0;
}

光看可能看不出来哪里有问题,那么我们可以试试在for循环里加一句【cout<<sum<<endl;】这样可以看到sum在每次循环时的状态值。(当然这里的错误并不是逻辑的问题,所以这么做并不能看出来)

以及,其实这个方法的原理跟编译器自带的debug功能原理相同,能掌握下面的debug方法固然最好,毕竟省时间呀。

运用编译器的debug调试功能

因为不怎么用不再赘述,指路一篇Dev-C++的调试指南:Dev C++单步调试/debug详细图解 - CaprYang的博客

另外给用Linux的小伙伴推一个gdb调试:gdb调试的基本使用 - H&K - 博客园


Ⅴ. 最后接好这堆网站安利ya——

①洛谷(https://www.luogu.com.cn/

这个不多说啦,刷题好去处。交题没AC的时候先努力思考一下自己的代码存在什么问题,但如果挠破头都想不到哪里有问题的话可以看看这道题目的讨论版,总能发现奇妙的东西(笑

实在过不了再尝试看看题解,学习学习优秀的思路hhhh

p.s.尤其推荐去刷试炼场的新手村,我觉得学完数组那一章以后新手村八个关卡基本上都没问题的啦,对自己有点信心呐。

②OI wiki(https://oi-wiki.org/

一个干货非常非常多的网站,如果有心走竞赛的话可以把它从里到外仔仔细细地刷个几遍,除了侧边栏的介绍和提醒以外,还有顶栏的语言基础和各种算法,应有尽有,肯定能找到你想要的hhhh(包括之前的位运算链接就是出自它的门下)。

③CSDN(https://www.csdn.net/

一个目前来说发展得比较好的IT中文论坛,虽然里面的博客有很多搬运的,重复率挺高,但早期还是有很多优秀的blog的。一般来说跟计算机有关的科普和问题都可以来这里找。

④0xFFFF(https://0xffff.one/

华南师大的搬砖技术社区!本校的论坛怎么能不支持一下呢!(还记得最开始水的时候还看到一篇讲Minecraft mod的帖子)
置顶那一篇计算机入门的帖强推!也强推Linux区的帖子kkkk学到了不少(虽然长期潜水)。

⑤Stack Overflow(https://stackoverflow.com/

如果能接受英文阅读的话,我强烈推荐这个网站!!很多编程相关的偏门到极点的问题最后都是在这里找到答案的!

而且它会有问题查重,保证剩下的都是比较优质的问题hhhh。当然你也可以在这里提问,只是提问之前请务必记得开头那篇《How To Ask Questions The Smart Way》。

唯一的缺点可能就是外网加载得比较慢吧(但是不用翻墙啊!)

⑥SoloLearn(https://www.sololearn.com/

这是!一个!好玩的!边学边练的!学语言的网站!也有配套APP!

在这里,你能学到各种语言的courses,通过先阅读基础知识再做一道题的形式,轻轻松松过完语法基础!
还能找人PK一大堆各种各样的语言基础选择题!妈妈再也不用担心我期末考试的程设选择题啦!(在线C++求战😃 互相PK互相进步)

⑦Github(https://github.com/

全世界最大的同性交友网站(咳。

GitHub是一个面向开源及私有软件项目的托管平台,简单来说就是能在上面找到很多有趣又好玩的开源项目,可以经常逛逛发现新大陆呐√。




欢迎捉虫,也欢迎大佬们指出不妥之处QvQ感谢阅读biu~

Woo 查了下,做的事情大概是差不多的,只是名头的问题,稍微梳理一下:

  • OI => Olympiad in Informatics 信息学奥林匹克竞赛
  • ACM => Association for Computing Machinery 计算机协会,是一个学术组织
  • ICPC => International Collegiate Programming Contest 国际大学生程序设计竞赛

通常我们说的 ACM 比赛指的的 ICPC,ACM 以往是 ICPC 的赞助方,然后传着传着名字就变成 ACM 了~

参考:

  1. OI 赛事与赛制 - OI Wiki
  2. 国际大学生程序设计竞赛 - 维基百科
  3. 计算机协会 - 维基百科
  4. ICPC 竞赛从 2018 年开始不再由 ACM 赞助 - 0xFFFF

    Woo 本来是觉得两个都差不多,然后感觉似乎OI的范围更大一点就用了OI(现在发现对OI有点误解哈哈哈哈抱歉🤣以为是信息学类竞赛来着)
    不过这么说的话其实面对大一新生更应该用ACM这个词啦✓

      2 年 后

      © 2018-2025 0xFFFF