骑车与走路

题目信息见下:

这是一道很基础的题目,本质上就是比较自行车与步行的速度。

这题看上去是道编程题目,但实质上,在初二学习完一次函数后,你可以清楚的认识到他们之间的距离与时间相关的关系。(当然,其实小学水平就够了,理清楚路程×速度=时间就可以了)

代码也很好写:

// Code #1
#include <cstdio>
using namespace std;

int main() {
	double num;
	scanf("%lf", &num);
	double walking = num / 1.2;
	double riding = num / 3.0 + 50.0;
	if (walking > riding) {
		printf("Bike");
	} else if (walking == riding) {
		printf("All");
	} else {
		printf("Walk");
	}
	return 0;
}

你觉得很简单吗?确实很简单,但恰巧的是,我这一题刚好错了!

// The Wrong Answer (Code #2)
#include <cstdio>
using namespace std;

int main() {
	double num;
	scanf("%lf", &num);
	double walking = 1.2 * num;
	double riding = 3.0 * num + 50.0;
	if (walking > riding) {
		printf("Bike");
	} else if (walking == riding) {
		printf("All");
	} else {
		printf("Walk");
	}
	return 0;
}

甚至这题我在那天晚上更正的时候也犯了错,原因是啥呢?

// The Answer's Wrong Part (From: Code #2)
double walking = 1.2 * num;
double riding = 3.0 * num + 50.0;

速度×时间=总路程,但那天考试我把关系列错了。如果没这个错误的话,我可能期末的考核中是满分,也算是一个遗憾吧,希望大家不要犯这种低级错误。

判断闰年

谈起这题,这题还真是一个在学习C++语言基础时遇到的一个老生常谈的问题:

这道题除了是我们上学校信息竞赛基础班中的一道课堂练习原题外,我也在3个月前发过思路:【C++学习笔记】平闰年计算思路 – 小改学习志

大体思路就是这一句话:

"四年一闰,百年不闰,四百年又闰"

大体写出来就是这样:

// Code #3
#include <cstdio>
using namespace std;

int main() {
	int num;
	scanf("%d", &num);
	if (num % 100 == 0 && num % 400 == 0) {
		printf("y"); 
	} else if (num % 4 == 0 && num % 100 != 0) {
		printf("y"); 
	} else {
		printf("n"); 
	}
	return 0;
} 

(上述代码是我在考试的时候赶时间写的,参考优化过的代码自己看我之前写过的原文)

分苹果

一般情况下,考试的最后一题都是压轴题:

所以我们基础班里有人就不太会做这一题了。但是,这题实际上配不上难题这一称号,甚至小学生看这一题都能看出端倪。

首先,每人都有,也就是不可能出现有人没拿到的情况,出现没人获得的这种情况直接pass。

然后,每人分到的量是不同的,也就不可能出现我和一个人拿的数量是相同的。

最后,至少多少个,也就是问我们最小值。

仔细端倪一下,要最小就要使得每个数之和最小,最简单粗暴的处理方法就是我每个数字都取可以取的最小数,相加肯定是最小的值。

因为每个小朋友都有,所以肯定是个正整数。从1开始,你会发现,如果都取最小的话就可以满足最小条件了,那不就是1234567这么排列嘛,本质上这组数据所构成的数列就是一个首项为1,公差为1的等差数列,求当有n人时,苹果的最少个数,就是求这组数据之和,你会发现:这不就是小学四年级左右学过的等差数列求和问题嘛,真把他们按照领取水果的份数多少排列,你会发现这个n其实就是这个数列中的最大一项,直接代入公式:(1+n)*n/2,一气呵成,压根脑子都不要。

(我为啥感觉这题那么像小学数学三四年级左右作业最后一道的思考题)

// Code #4
#include <cstdio>
using namespace std;

int main() {
	int n, a;
	scanf("%d", &n);
	a = (1 + n) * n / 2;
	printf("%d", a); 
	return 0;
} 

抛开题目不谈,这题并没有我说的那样思路如此复杂,把你放到幼儿园中,你为了能图发的苹果总数越少,并且每个孩子拿的数量都不一样,不也是先从1号小朋友开始发,因为不知道最多要发多少个,先发1个,再为2号小朋友发2个,3号小朋友发3个,以此类推嘛。

他的背景就是以小学作业思考题的情境为背景,但难度并不高,不过,如果不愿意上手做这道题,不代表没有难度,我看我旁边的同学都是拿循环硬解的,虽然这也的确是解决这题的正解。

粗略总结

别看这次题目出的跟哄小孩似的,信息基础班的淘汰率仍然高达59%。

看似简单的题目,却能够造就如此大的区分度,这也是令我好奇的一点,但其实各位也是上过中学信息课的人了,也早已知道造就这种现象的根本原因。