1030. 完美数列(25)
给定一个正整数数列,和正整数p,设这个数列中的最大值是M,最小值是m,如果M <= m * p,则称这个数列是完美数列。
现在给定参数p和一些正整数,请你从中选择尽可能多的数构成一个完美数列。
输入格式:
输入第一行给出两个正整数N和p,其中N(<= 105)是输入的正整数的个数,p(<= 109)是给定的参数。第二行给出N个正整数,每个数不超过109。
输出格式:
在一行中输出最多可以选择多少个数可以用它们组成一个完美数列。
输入样例:10 8 2 3 20 4 5 1 6 7 8 9输出样例:
8
第一个版本
1 #include "stdio.h" 2 void sort(double a[],int n); 3 void swap(double *a,double *b); 4 int main(int argc, char const *argv[]) 5 { 6 double a[100010],p; 7 int i,n; 8 scanf("%d %lf",&n,&p); 9 getchar(); 10 for(i=0;i<n;i++) 11 scanf("%lf",&a[i]); 12 sort(a,n); 13 for(i=n-1;i>0;i--) 14 { 15 if(a[i]<=(a[0]*p)) 16 { 17 break; 18 } 19 20 } 21 printf("%d ",i+1 ); 22 return 0; 23 } 24 void sort(double a[],int n) 25 {int i,j; 26 for(i=0;i<n;i++) 27 {for(j=i+1;j<n;j++) 28 { 29 if(a[i]>a[j]) 30 swap(a+i,a+j); 31 } 32 } 33 34 } 35 void swap(double *a,double *b) 36 { 37 double temp; 38 temp=*a; 39 *a=*b; 40 *b=temp; 41 42 }
第二个版本
1 #include "stdio.h" 2 #include "stdlib.h" 3 int cmp(void const *a,void const*b); 4 int main(int argc, char const *argv[]) 5 { 6 double *a,p; 7 int i,j,n,count=0; 8 while(~scanf("%d %lf",&n,&p)) 9 { 10 a=(double*)malloc(n*sizeof(double)); 11 for(i=0;i<n;i++) 12 scanf("%lf",&a[i]); 13 14 qsort(a,n,sizeof(double),cmp); 15 for(i=0;i<n;i++)//遍历将a[i]作为最小值 16 for(j=i+count;j<n;j++)// 17 { 18 if(a[j]>(a[i]*p)) 19 break; 20 if(j-i+1>count) 21 count=j-i+1; 22 } 23 printf("%d ",count ); 24 free(a); 25 } 26 return 0; 27 } 28 int cmp(void const *a,void const*b) 29 { 30 return *((double*)a)-*((double*)b); 31 }
思路:首先p与最小数相乘可能会超出int范围,所以这里用double,其次我们应该先将数组排序以方便计算,然后我们用双重for循环查找,查找的思路是从第一个元素作为最小数,开始往后找最大数,直到不符合条件,记录下此时的长度,然后将第二个元素作为最小数,再继续找,最后比较长度的最大值并输出,但是这样会超时,所以我们要对她进行优化,减少不必要的循环,优化的思路如下:
首先我们同样保持第一个for循环遍历最小值,在第二个for循环中我们将j置为前一个元素作为最小数时候的长度,这样就减少了小于上一次的不必要的for循环,j依然小于 N,用一个if判断是否符合条件,用另一个if判断此次是否大于上次的长度,比如说我们把样例中的数据已经排好序:1 2 3 4 5 6 7 8 9 20 ,此时我们将array[0]作为最小数,依次向后遍历,最大数j-最小数i+1即为数列的长度,最终找到8为最大的数,此时数列长度count为8,在将a[1]作为最小数的时候,我们直接将j置为1+8为9,直接比较a[1]和a[9]作为最小最大值得时候是否满足,不满足则a[1]最为最小数的时候并不能使数列变得更长,则继续再看a[2],这样等到有大于8的时候再更新,就可以
参考http://blog.csdn.net/wanmeiwushang/article/details/51456488