JavaScript PAT乙级题解 1030 完美数列

文章讲述了作者在解决一个关于构建完美数列的编程问题上遇到的困难,最初尝试的解决方案因为数据范围处理不当导致测试用例失败。作者意识到问题并非在于使用JavaScript的数据类型限制,而是算法思路不够优化。通过学习他人的解决方案,作者理解到自己的算法效率低下,并分享了最终得到满分的代码,强调了研究他人代码以提升编程技巧的重要性。
摘要由CSDN通过智能技术生成

题目如下:

给定一个正整数数列,和正整数 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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值