ACM录 之 常识和错误。
接下来说说一些ACM里面的常识和错误。。。(可能会比较乱)
—— 首先ACM里面的代码都是要提交上去,然后让计算机自动判题的,所以。。。千万不要把 system("pause"); 加上去,不管自己怎么搞,提交之前千万记得不要有这句话,不然怎么死的都不知道。
—— 然后就是提交上去之后是立马返回结果的(网络卡了或者服务器挂了不算),结果一般有 AC(也就是对了),WA(答案错误),TLE(超时),MLE(超出内存限制),PE(答案对,格式错。),RE(在判题机上运行的时候程序崩溃,一般有数组越界,或者栈溢出。),CE(编译错误。。。)
—— 然后就是程序运行有时间限制,一般来说1s的话按照现在计算机的速度可以运行10^7这个数量级次,所以提前根据数据范围算一下大约需要运行多少次,然后看看会不会超时。
—— 内存的限制如果是 64MB,一个 int 类型的数占4个字节,也就是 4B,那么64MB也就是 64*1024*1024 / 4 个int类型的数,所以也要注意是否会超内存。。。
—— 提交程序的话就是在做题的那个网页找到 submit 按钮,然后复制代码过去就行。。。
—— 头文件。。。为了省事,一般我是直接弄上很多头文件然后写代码。如下:
#include <stdio.h> #include <string.h> #include <iostream> #include <algorithm> #include <vector> #include <queue> #include <set> #include <map> #include <string> #include <math.h> #include <stdlib.h> #include <time.h>
—— 关于数据类型的表示范围,int的表示范围是-2^31 到 2^31-1 也就是大约10^9的范围,写代码前估算一下如果中间值或者结果可能超过这个数,就尽量不要用int了。这时可以用 long long 这种类型,他的表示范围是 -2^63 到 2^63-1,大约就是10^18多。。。这时注意如果超过了这个数,就要用自己写的高精度类了(以后会说。)然后是long long这种类型的输入输出,如果是cin cout的话不用管,但是scanf他们就不行了,有些是 %lld 有些是 %I64d 对,不同的服务器不一样,就是这么坑,一般比赛前会说,也可以向裁判提问用哪一种。。。
—— 至于double和float的问题,首先推荐使用double就行,注意这些类型都是用二进制来表示小数的,转为十进制的话表示的精度 double大约是14位有效数字(不是小数点后面的位数)。另外就是各种加减乘除还有数学函数运算会让精度下降,也就是只有大约前10位是准确的,后面就呵呵了,运算次数多的话。。。精度会更差。。。而且负数的精度比正数差不少。。。所以精度问题一直是最大的坑点之一,刚开始还接触的少,后面有无数会卡精度的题目,也就是和答案很接近但是就是差那么个0.000001就算错。。。
然后有一个sgn函数来确定double,具体如下:
const double eps=1e-8; // 根据题目需要修改。 inline int sgn(double x) // x负数返回-1,近似0返回0,正数返回1。 { return x<-eps ? -1 : x>eps; }
—— 另外注意double不要用 == 来判断相等,因为误差,会导致运算之后有很小的差别,所以一般只要 b-eps < a < b+eps 那么就算是a和b相等,一般 eps = 1e-8 或者 -9 或者 -10等等。。。
—— 饿。。。暂时想不起来还有啥了,未完待续。。。