#8817. CCF201604-1 折点计数(100分)【序列处理】

CCF201604-1 折点计数(100分)【序列处理】

问题描述   
给定n个整数表示一个商店连续n天的销售量。如果某天之前销售量在增长,
而后一天销售量减少,
则称这一天为折点,
反过来如果之前销售量减少而后一天销售量增长,也称这一天为折点。其他的天都不是折点。
如下图中,第3天和第6天是折点。 image 给定n个整数a 1, a 2, …, a n表示销售量,请计算出这些天总共有多少个折点。   
为了减少歧义,我们给定的数据保证:在这n天中相邻两天的销售量总是不同的,
即a i -1≠a i。注意,
如果两天不相邻,销售量可能相同。

输入格式

输入的第一行包含一个整数n。   第二行包含n个整数,用空格分隔,分别表示a 1, a 2, …, a n。

输出格式

输出一个整数,表示折点出现的数量。

样例输入

7 5 4 1 2 3 6 4

样例输出

2

评测用例规模与约定

所有评测用例满足:1 ≤ n ≤ 1000,每天的销售量是不超过10000的非负整数。

问题分析:

重写解题博客以及解题程序代码(参见参考链接),解题逻辑更加清晰,解题代码更加简洁,多种语言解法。

解法一:数组处理

把需要处理的数据读入到程序中的数组里,然后再进行处理,是一种最为常见的做法。每3个数就可以判定是否有折点,n个数需要做n-2次判定。折点有两种,一种是中间点值最大,另外一种是中间点值最小。循环语句for的结束判定尽量不要有表达式,可以避免程序没有进行优化编译时,出现多余的计算。

解法二:输入流处理

如果要求不允许使用数组,则需要使用更高的编程技巧。本来程序的输出是字符流,通过函数scanf()和格式"%d"读入整数,将其转换为整数流,再对整数流进行处理,一边判定折点,一边进行统计。 对输入数据按输入流进行处理,可以不使用数组等变量或只使用简单变量。技巧比较高一些,是职业程序员应该掌握的技巧和解题思路,习惯了也就好了。

解法三:多重流箭头流

这种解法是笔者最早写的题解,被许多人认为难懂,确实是难懂了一些。但是,难懂的东西,往往是因为编程技巧高了一些,过程有点复杂,思路与一般人所想有所不同。   输入n个数的话,就有n-1个相邻的数可以进行比较,得出向上或向下(相邻2天不相等)的结果(箭头)。对于n-1个箭头,将其看成是一个输入流,相邻的箭头可以进行n-2次比较来判定折点。箭头可以编码为0和1。 以下

输入样例:

7 5 4 1 2 3 6 4

相邻2个数进行比较,可以得出箭头流如下:

DOWN DOWN UP UP UP DOWN

用0和1进行编码得序列如下:

0 0 1 1 1 0

对以上序列进行折点计算即可。

这里也给出解题的Python语言程序和Java语言程序,以上各种解法都是有的。

Limitation

1s, 1024KiB for each test case.