#include<stdio.h>
#include<algorithm>
#include<stdlib.h>
using namespace std;
//M<mp M最大值 m最小值 p参数
//n=M/p 即最小值的限制条件 m>=n 考虑到n为小数时,故m>n
int main() {
int N;
double p;
scanf_s("%d %lf", &N, &p);
int *num = (int*)malloc(sizeof(int) * N);
for (int i = 0; i < N; i++) {
scanf_s("%d", &num[i]);
}
sort(num, num + N);
int h = 0;
int max = 0;
//第一个i循环用于遍历
for (int i = 0; i < N; i++) {
//j从i+h开始,因为上一次循环打下基础,从i到h的数均满足完美数列条件,提高程序效率直接cog上一次的最后一个合理项开始
//另一个原因是,max只有两种可能,要么比原max大,要么等于原max,其他情况没必要仔细求解
for (int j = i + h; j < N; j++) {
//必须是<=,因为题目条件是=
if (num[j] <= num[i] * p) {
//记录数列个数
h = j - i;
}
//不满足max<=min*p跳出循环,其之后也不会存在可能满足情况了,因为max越来越大,min与p不变
else {
break;
}
}
if (max < h + 1) {
//个数而非下标,需要+1
max = h + 1;
}
}
printf("%d", max);
}
PAT1030 完美数列 需完善
最新推荐文章于 2024-07-11 21:59:38 发布