乙级的题目训练主要用来熟悉编程语言的语法和形成良好的编码习惯和编码规范。从小白开始逐步掌握用编程解决问题。
PAT乙级BasicLevelPractice 1030 完美数列
题设给定一个正整数数列, 要求找出从中尽可能多的数组成一个数列,使得新数列满足指定条件。
即, 新数列的最大值 小于等于 新数列的最小值 乘以 给定系数p.
由于数列和系数p是给定的, 变量是选取不同子数列后所对应的最大值和最小值。
所以这是一个找满足指定条件的一对数作为最大值和最小值的问题。
因为有最大值最小值之后, 只要把值在最值区间的数都放入新数列就即是满足条件的队列。
而要让数列元素尽可能多,就需要让最值区间范围尽可能大,也就是需要让最大值和最小值差值尽可能大。
由于给定的数列值不是连续的,所以我们需要将数列先排序,然后用最大值最小值的索引位置差距来计算数列元素个数。
(排序后的数列, 需要选择索引为i的元素和索引为i+n的元素作为最小值和最大值, 则元素个数为(n+1) = (i+n) - i + 1)
最直接的方法就是我们对所有可能的组合(number_1, number_2)进行计算, 然后记录组成新数列元素最多的一个。
可以优化的是, 如果我们当前已经找到满足条件的数列最长为n个元素, 则下次查找时, 可以从最小值之后n个元素开始选择作为最大值。
这样可以跳过那些尽管满足条件, 但是数列元素个数不会超过n个的情况。