一、题目
给定一个正整数数列,和正整数 p p p,设这个数列中的最大值是 M M M,最小值是 m m m,如果 M ≤ m p M \le mp M≤mp,则称这个数列是完美数列。
现在给定参数
p
p
p 和一些正整数,请你从中选择尽可能多的数构成一个完美数列。
输入格式:
输入第一行给出两个正整数
N
N
N 和
p
p
p,其中
N
N
N
(
≤
1
0
5
)
(\le10^{5})
(≤105)是输入的正整数的个数,
p
p
p
(
≤
1
0
9
)
(\le10^{9})
(≤109)是给定的参数。第二行给出
N
N
N 个正整数,每个数不超过
1
0
9
10^{9}
109 。
输出格式:
在一行中输出最多可以选择多少个数可以用它们组成一个完美数列。
输入样例:
10 8
2 3 20 4 5 1 6 7 8 9
输出样例:
8
代码长度限制 16 KB
时间限制 200 ms
内存限制 64 MB
二、我的AC代码
#include <stdio.h>
#include <stdlib.h> //包含标准库函数qsort()。
int compare(const void *a,const void *b); //qsort()的自定义的比较函数。
int main(void)
{
/* 读取输入的个数和参数 */
int N; //输入的正整数的个数。
long p; //给定的参数。
scanf("%d %ld", &N, &p);
/* 读取输入的N个正整数 */
long numArray[N]; //数组numArray用于存放输入的N个正整数。
for(int i=0; i<N; i++){
scanf("%ld", &numArray[i]);
}
/* 将N个正整数按升序进行排序 */
qsort(numArray, N, sizeof(long), compare); //快速排序qsort()函数,在头文件stdlib.h中。
/* 计算出一个完美数列中的数的最多个数 */
int maxNum = 0; //表示最多可以选择多少个数来组成一个完美数列。
for(int m=0; m<N; m++){ //最小值从小到大,逐个计算出对应的完美数列中的数的最多个数。
for(int M=m+maxNum; M<N; M++){ //因为是找最多个数,所以最大值直接从第(当前最多个数)个数字开始推算。
if(numArray[M] <= numArray[m] * p){ //满足完美数列的条件时。
if((M-m+1) > maxNum){ //当前的完美数列中的数的个数比原来的完美数列最多个数要多时。
maxNum = M - m + 1; //更新完美数列中的数的最多个数。
}
}else{ //不满足完美数列的条件时。
break; //结束当前最小值所在完美数列的最多个数计算。
}
}
}
/* 输出一个完美数列中的数的最多的个数 */
printf("%d\n", maxNum);
return 0;
}
/* 自定义排序规则,用于qsort()函数 */
int compare(const void *a,const void *b)
{
/* 初始化,将传入的两个无类型的指针,强制转换为所需要的数据类型 */
long *la = (long *)a;
long *lb = (long *)b;
/* 比较大小的规则 */
int result;
result = *la - *lb; //a比b大,则交换两数的位置,即升序排序。
return result; //返回正数则交换两数,返回负数则不换,返回0时也暂时不换。
}