1030 完美数列 (25分)
给定一个正整数数列,和正整数 p,设这个数列中的最大值是 M,最小值是 m,如果 M≤mp,则称这个数列是完美数列。
现在给定参数 p 和一些正整数,请你从中选择尽可能多的数构成一个完美数列。
输入格式:
输入第一行给出两个正整数 N 和 p,其中 N(≤10 ^5)是输入的正整数的个数,p(≤10 ^9)是给定的参数。第二行给出 N 个正整数,每个数不超过 10 ^9
。
输出格式:
在一行中输出最多可以选择多少个数可以用它们组成一个完美数列。
输入样例:
10 8
2 3 20 4 5 1 6 7 8 9
输出样例:
8
C程序代码示例(无论何时都只会蛮力法的菜鸟)
提交结果
不知道是不是排序递归的原因,只能放弃这2分了
代码
#include <stdio.h>
int partion(int num[],int left,int right){
int temp=num[left];
while(left<right)
{
while(left<right && num[right]>=temp)
right--;
num[left]=num[right];
while(left<right && num[left]<=temp)
left++;
num[right]=num[left];
}
num[left]=temp;
return left;
}
void quickSort(int num[],int left,int right,int n){
if(left<right){
int temp=partion(num,left,right);
quickSort(num,left,temp-1,n);
quickSort(num,temp+1,right,n);
}
}
int main(){
int N,p; //输入数字的个数N和参数p
int result=0; //记录完美数列的最大个数
scanf("%d %d",&N,&p);
int num[N];
for(int i=0;i<N;i++){
scanf("%d",&num[i]);
}
quickSort(num,0,N-1,N); //快速排序
int left=N-1; //设置一个左标识
int right=N-1; //设置一个右标识
while(left>=0){ //只要left>0,循环继续
if(num[left]*p>=num[right]){
if(right-left+1>result){
result=right-left+1;
}
left--;
}else {
right--;
}
}
printf("%d",result);
return 0;
}