1030 完美数列(25)(25 分)
给定一个正整数数列,和正整数p,设这个数列中的最大值是M,最小值是m,如果
,则称这个数列是完美数列。
现在给定参数p和一些正整数,请你从中选择尽可能多的数构成一个完美数列。
输入格式:
输入第一行给出两个正整数N和p,其中N(<=
)是输入的正整数的个数,p(<=
)是给定的参数。第二行给出N个正整数,每个数不超过
。
输出格式:
在一行中输出最多可以选择多少个数可以用它们组成一个完美数列。
输入样例:
10 8
2 3 20 4 5 1 6 7 8 9
输出样例:
8
解析
这题首先把输入的数列排序。再嵌套for循环即可。用c语言就要自己写排序代码,写冒泡等O(
)算法会运行超时。如果你能写快派自然是最好(随便练习快派d=====( ̄▽ ̄*)b)。我用了STL里的sort.
为什么我贴了两个代码呢?看注释。
完整代码:
AC:
#include<stdio.h>
#include<stdlib.h>
#include<algorithm>
int main()
{
int num,p;
scanf("%d %d",&num,&p);
double *array=(double *)malloc(sizeof(double)*num);
for(int i=0;i<num;i++)
scanf("%lf",array+i);
std::sort(array,array+num);
int max=0;
for(int i=0;i<num;i++){
for(int j=i+max;j<num;j++){
if(array[j]>array[i]*p)
break;
if(j-i+1>max)
max=j-i+1;
}
}
printf("%d",max);
}
超时:
#include<stdio.h>
#include<stdlib.h>
#include<algorithm>
int main()
{
int num,p;
scanf("%d %d",&num,&p);
double *array=(double *)malloc(sizeof(double)*num);
for(int i=0;i<num;i++)
scanf("%lf",array+i);
double *amplify=(double *)malloc(sizeof(double)*num);
std::sort(array,array+num);
for(int i=0;i<num;i++)
*(amplify+i)=*(array+i)*p;
int max=0;
for(int i=0;i<num-1;i++){
for(int j=num-1;j>=(max+i);j--){ //不能从数组末->数组头。
if((j-i+1) < max) // 因为题目输入的p很小,所以导致完美数列长度很小。
break; // 所以就说,题目输入的一行数字,只有前面几个数能组成
if(*(amplify+i)>=*(array+j)){ //完美数列,或后面几个数能组成完美数列。
max = (j-i)+1; //所以从数组头->数组末 才行。
break;
}
}
}
printf("%d",max);
}