题目如下:
给定一个正整数数列,和正整数 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
题解如下:
最后一个case没过,差2分,我已经看淡了,在网上找答案,基本上都是用C/C++,然后说最后一个case是数据范围问题,不能用int,得long。然后我就把我的数据都转成了BigInt,结果不仅case5不对,case4也超时了
这个代码差2分,而且思路很憨,又参考别人的代码重新做了一遍,最下面的代码是满分的
var readline = require("readline");
var rl = readline.createInterface({
input: process.stdin,
output: process.stdout
})
var rows = 2;
var inputs = [];
rl.on("line", function(data) {
inputs.push(data)
if(rows == inputs.length) {
var p = inputs[0].split(' ')[1];
var arr = inputs[1].split(' ');
console.log(deal(arr, p));
}
})
function deal(arr, p) {
if(arr.length == 1) {
if(1 <= p) {
return 1;
} else {
return 0;
}
}
// 升序排列
arr.sort((a, b) => {
return Number(a - b);
})
for(var i = 0; i < arr.length; i++) {
var minIndex = i;
var maxIndex = arr.length - i - 1;
var num = maxIndex - minIndex + 1;
// 没有数可以组成完美数列
if(minIndex > maxIndex) {
return 0;
}
if(arr[maxIndex] <= arr[minIndex] * p) {
return num;
} else {
if(arr[maxIndex - 1] <= arr[minIndex] * p) {
return --num;
} else if(arr[maxIndex] <= arr[minIndex + 1] * p) {
return --num;
}
}
}
}
我有一个特别不好的习惯,懒得去看那些C/C++/Java的代码,嫌看不明白,懒得去研究别人的思路,但是实际上自己的思路很垃圾,然后今天实在是受不了每次都少一点分,就逼着自己去看了一下,结果,人家的就是牛!!!!!我的想法就是很垃圾!!!!我以后一定,多多研究别人的代码,努力向上
压根就不是转BigInt的问题,js中Number的数据范围很大,正负2的53次方
然后,明天把之前那些差1个case的代码都改掉!!!!受不了了啊啊啊啊啊啊
var readline = require("readline");
var rl = readline.createInterface({
input: process.stdin,
output: process.stdout
})
var rows = 2;
var inputs = [];
rl.on("line", function(data) {
inputs.push(data)
if(rows == inputs.length) {
var p = inputs[0].split(' ')[1];
var arr = inputs[1].split(' ');
console.log(deal(arr, p));
}
})
function deal(arr, p) {
if(arr.length == 1) {
if(1 <= p) {
return 1;
} else {
return 0;
}
}
var cnt = 0;
var max = 0;
// 升序排列
arr.sort((a, b) => {
return Number(a - b);
})
for(var i = 0; i < arr.length; i++) {
// 如果剩余数组的长度<=max,那max肯定就是最大的那个数,直接break就可以
if(arr.length - i + 1 <= max) {
break;
}
cnt = 0;
for(var j = i + max; j < arr.length; j++) {
if(arr[j] <= arr[i] * p) {
cnt = j - i + 1;
if(cnt > max) {
max = cnt;
}
} else {
break;
}
}
}
return max;
}