转载!!ACM Tips #1

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可以像intchar那样用
  • string怎么输入,怎么输出
  • string也可以像字符数组那样操作(下标之类的)
  • 试着用string+号拼接字符串

sort

不用再自己写冒泡排序了!C++有现成的排序可供使用!而且比冒泡排序快!

那么同样给出几点:

  • 要用sort需要#include<algorithm>using namespace std;
  • 掌握sort的用法,并试着用sort重写第一次训练的第五题

时间复杂度

这是一个十分重要的概念,学会它之后你们就掌握了如何预估一个程序会跑多久,这在算法竞赛中是十分重要的(至少它会避免你在一个注定为TLE的算法上耗太多时间和精力)

同样给出几点:

  • 评测姬一秒差不多会做10的9次方次简单计算(或者简单步骤)
  • 了解大O标记法
  • 冒泡排序的时间复杂度是?
  • 冒泡排序为什么会比sort慢呢?

猜你喜欢

转载自blog.csdn.net/weixin_43887417/article/details/84888648