ACM Tips #1
为什么不能有输入提示
以上次讲过的a+b problem为例,可能会有同学会想给一些人性化设计,于是就添加了输入提示:
#include <cstdio>
int main()
{
int a, b;
printf("Please input two integer: \n");
while(scanf("%d%d", &a, &b) != EOF)
{
printf("%d\n", a+b);
}
return 0;
}
显然,结果会返回Wrong Answer
。那这是为什么呢?
事实上评测系统并不会care你的人性化设计,它只关心你的代码的输出跟标准输出是否一字不差。
而显然,这个代码给出的输出在评测系统看来就是错的。
我们假设这么一个输入:
1 1
1 2
那么标准答案会是:
2
3
而上述代码给出的输出是:
Please input two integer:
2
3
评测姬一看,哦豁,你这多出一行,WA了,走好不送。
所以不要试图加入任何人性化设计,包括额外的输出以及system("pause")
之类的语句都不需要加入,因为你面对的并不是人,而是铁面无私的评测姬。
上次漏掉的一种会导致RE的情况
我们假设有这么一道题目:第一行输入正整数n,第二行输入n个正整数,你需要输出他们的和。
给个样例吧:
Input:
4
1 3 2 5
Output:
11
题目的数据范围为,n<=1000,结果保证在int范围内。
首先,对于这种题目,目前看来大家都倾向于开一个长度为n的动态数组。
但是可以注意到,极端情况下数组大小也只有1000,那为何不一开始就开个长度为1000的数组呢?
毕竟开动态数组还是比较麻烦的一件事,能用静态最好就是用静态。
好的,于是有些同学悟到了,开始顺手写了代码:
#include <cstdio>
int main()
{
int a[1000], n;
scanf("%d", &n);
for(int i = 0; i < n; i++)
{
scanf("%d", &a[i]);
}
int sum = 0;
for(int i = 0; i < n; i++)
{
sum += a[i];
}
printf("%d\n", sum);
return 0;
}
测试一波,觉得自己很稳,一交,RE了
为什么呢?事实上也并不是所有情况都会RE,但是有时候它就是给你RE了。
事实上这种RE是数组访问越界导致的RE。也就是说,假设数组大小1000,你访问到a[1000],它就可能给你RE了。
事实上有时候a[1000]是可以访问的,但是那里是没有初始化的未知空间,甚至里面存的可能是你所使用的另一个变量,这个时候就可能出现数据乱搞然后导致WA
那么为什么会访问越界呢?这个原因比较玄学以及事实上我也不清楚(这个真的超出我的知识范围了orz)
所以一般情况下,保险起见,开数组的时候会多开几个位置。也就是说,假设我们需要大小为1000的数组,那么我会这么开:
int a[1005]; // 习惯多开五个,也有人开十个或两个的
这仅仅是一种保险措施,但多开几个又不会少块肉,不是吗。
一些需要你们自己查或者自己试的知识
总觉得啥都给你们讲明白就没意思了,毕竟对ACM来说自学能力是十分重要的一环。
所以这里会留给一些东西给你们自己去查一查。以后如果还有更新的话,需要自学的知识占比重会越来越多。
ASCII码
你们可以自学一下ASCII码,如果能理解以下几个点就差不多了
- 字符其实也是数字
- 更高级点,字符其实也可以用于计算
5
并不等于'5'
- 也就是说,想用
if(c == 5)
来判断字符变量c
的值是否为字符5
是不行的
- 也就是说,想用
string
这个不同于c语言的string.h
,而是C++的string
。它属于STL中容器的一员。学会使用它你们就可以在大部分时候摆脱字符数组了。
那么同样给出几个点:
- 明白
string
可以像int
,char
那样用 string
怎么输入,怎么输出string
也可以像字符数组那样操作(下标之类的)- 试着用
string
的+
号拼接字符串
sort
不用再自己写冒泡排序了!C++有现成的排序可供使用!而且比冒泡排序快!
那么同样给出几点:
- 要用
sort
需要#include<algorithm>
和using namespace std;
- 掌握sort的用法,并试着用sort重写第一次训练的第五题
时间复杂度
这是一个十分重要的概念,学会它之后你们就掌握了如何预估一个程序会跑多久,这在算法竞赛中是十分重要的(至少它会避免你在一个注定为TLE的算法上耗太多时间和精力)
同样给出几点:
- 评测姬一秒差不多会做10的9次方次简单计算(或者简单步骤)
- 了解大O标记法
- 冒泡排序的时间复杂度是?
- 冒泡排序为什么会比
sort
慢呢?