给定一个正整数数列,和正整数 p,设这个数列中的最大值是 M,最小值是 m,如果 M≤mp,则称这个数列是完美数列。
现在给定参数 p 和一些正整数,请你从中选择尽可能多的数构成一个完美数列。
输入格式
输入第一行给出两个正整数 N 和 p,其中 N(≤ 105 )是输入的正整数的个数,p(≤10 9 )是给定的参数。第二行给出 N 个正整数,每个数不超过 10 9 。
输出格式:
在一行中输出最多可以选择多少个数可以用它们组成一个完美数列。
输入样例:
10 8
2 3 20 4 5 1 6 7 8 9
输出样例:
8
思路:
因 p(≤10 9 ),这N 个正整数每个都不超过 109 ,mp≤10 18,建议用 double
或 long
类型定义数组
(2021-08-19实测 int arr[N]
也可以 AC)
用数组循环接收数据后排序
分两层循环,外层循环从 i = 0
开始,arr[i]
即完美数列的最小值 m,内层循环从 j = i + lenth
开始,arr[j]
为完美数列的最大值,寻找符合M ≤ mp 最大的 arr[j]
,记录此时的数列长度 lenth = j - i
,不满足时跳出内层循环
对于记录的数组长度 lenth ,每次循环时直接检验 arr[i]
≤ arr[ j + lenth ]
的大小关系,即检验此时的数列长度是否超过之前记录的最长数列长度,为真 则记录新的 lenth,为假 则进行下一次循环
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 100010;
double arr[N] = { 0 };
int main() {
int n, i, j, lenth = 0;
double p;
cin >> n >> p;
for (i = 0; i < n; i++)
cin >> arr[i];
sort(arr, arr + n);
for (i = 0; i < n; i++) {
for (j = i + lenth; j < n; j++) {
if (arr[j] <= arr[i] * p)
lenth = j - i;
else break;
}
}
cout << lenth + 1;
return 0;
}