PAT乙级 (二分) 1030.完美数列

简介: PAT乙级 (二分) 1030.完美数列

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

代码:

#include<iostream>
#include<algorithm>
using namespace std;
//定位M
int locateMax(int* arr, int count, int i, long long x){
    //判断x是否大于最大值
    if (arr[count - 1] <= x) return count;
    int low = i - 1, high = count - 1, mid;
    //二分查找
    while(low < high){
        mid = (high + low) / 2;
        if (arr[mid] > x) high = mid - 1;
        else low = mid + 1;
    }
    return low;
}
int main(){
    int count, number[100010] = { 0 }, res = 1;
    //参数需要用long long,否则测试点5过不去
    long long p;
    cin >> count >> p;
    for (int i = 0; i < count; i++){
        cin >> number[i];
    }
    //给数组排序
    sort(number, number + count);
    //得到满足条件的最大数组长度
    for (int i = 0; i < count; i++){
        int j = locateMax(number, count, i, number[i] * p);
        res = max(res, j - i);
    }
    cout << res;
    return 0;
}


相关文章
|
7月前
|
算法 Java
LeetCode寻找两个有序数组的中位数打败100%人
LeetCode寻找两个有序数组的中位数打败100%人
59 0
|
7月前
|
人工智能 算法
前缀和算法题(区间次方和、小蓝平衡和、大石头的搬运工、最大数组和)
前缀和算法题(区间次方和、小蓝平衡和、大石头的搬运工、最大数组和)
|
人工智能 算法 C++
洛谷 P1090 合并果子(贪心)
洛谷 P1090 合并果子(贪心)
137 0
|
机器学习/深度学习 算法
蓝桥杯:递推算法 递归算法 例题:斐波纳契数列
蓝桥杯:递推算法 递归算法 例题:斐波纳契数列
68 0
|
算法
【leedcode】0004. 两个有序数组的中位数
【leedcode】0004. 两个有序数组的中位数
78 0
|
存储 算法 索引
【每日挠头算法题】LeetCode 1337. 矩阵中战斗力最弱的 K 行 —— 二分 + 排序 / 堆
【每日挠头算法题】LeetCode 1337. 矩阵中战斗力最弱的 K 行 —— 二分 + 排序 / 堆
122 0
【每日挠头算法题】LeetCode 1337. 矩阵中战斗力最弱的 K 行 —— 二分 + 排序 / 堆
|
算法
二分&三分
二分&三分
152 0
二分&三分
|
机器学习/深度学习
2055. 蜡烛之间的盘子 : 二分 & 前缀和 运用题
2055. 蜡烛之间的盘子 : 二分 & 前缀和 运用题
跟着英雄学算法2数列
跟着英雄学算法2数列
跟着英雄学算法2数列