给定一个正整数数列,和正整数 p,设这个数列中的最大值是 M,最小值是 m,如果 M≤mp,则称这个数列是完美数列。
现在给定参数 p 和一些正整数,请你从中选择尽可能多的数构成一个完美数列。
输入格式:
输入第一行给出两个正整数 N 和 p,其中 N(≤105)是输入的正整数的个数,p(≤109)是给定的参数。第二行给出 N 个正整数,每个数不超过 109。
输出格式:
在一行中输出最多可以选择多少个数可以用它们组成一个完美数列。
输入样例:
10 8
2 3 20 4 5 1 6 7 8 9
// 结尾无空行
输出样例:
8
// 结尾无空行
解题思路:
分析:首先将数列从小到大排序,
设当前结果为result = 0,
当前最长长度为temp = 0;
从i = 0~n,j从i + result到n,
因为是为了找最大的result,
所以下一次j只要从i的result个后面开始找就行了
每次计算temp若大于result则更新result,最后输出result的值
解题代码:
const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
let n = 0, p = 0;
let nums = [];
rl.on('line', function(line) {
if(n === 0) {
n = parseInt(line.split(' ')[0]);
p = parseInt(line.split(' ')[1]);
} else {
nums = line.split(' ').map(item => parseInt(item));
}
})
rl.on('close', function() {
nums.sort((a, b) => a - b);
let res = 0, temp = 0;
for(let i = 0; i < n; i++) {
for(let j = i+res; j < n; j++) {
if(nums[j] <= nums[i] * p) {
temp = j - i + 1;
if(temp > res)
res = temp;
} else {
break;
}
}
}
console.log(res);
})