给定一个正整数数列,和正整数 p,设这个数列中的最大值是 M,最小值是 m,如果 M≤mp,则称这个数列是完美数列。
现在给定参数 p 和一些正整数,请你从中选择尽可能多的数构成一个完美数列。
输入第一行给出两个正整数 N 和 p,其中 N(≤)是输入的正整数的个数,p(≤)是给定的参数。第二行给出 N 个正整数,每个数不超过 1。
在一行中输出最多可以选择多少个数可以用它们组成一个完美数列。
10 8
2 3 20 4 5 1 6 7 8 9
8
解题思路
测试点 1 2 3 从有序数组0位置开始,得到的完美数列长度
测试点0 5 从每个元素开始的完美长度是不同的,并非从有序数组位置0开始的完美数列长度就是最长完美长度,需要动态更新最长完美数列长度
测试点 4 是边界检测,对算法效率有一定要求,使用快排就可以通过
1 #include "stdio.h" 2 #include "stdlib.h" 3 //每次需要比较最大最小值, 4 //给出的数据为乱序数组,需要有序化,需要对大量数据排序,因此算法效率是非常重要的,可以使用自带库函数qsort,原理是快排 5 //在得出有序数组后,需要计算最大完美数列长度,从0位置开始分别统计从0到队尾的每个元素开始的完美数列长度,比较得出最大值 6 7 typedef long ElementType; 8 9 //快排 严蔚敏版 10 int partition(ElementType *a,int left,int right){ 11 ElementType pivot=a[left]; 12 while(left<right){ 13 while(left<right&&a[right]>=pivot)--right; 14 a[left]=a[right]; 15 while(left<right&&a[left]<=pivot)++left; 16 a[right]=a[left]; 17 } 18 a[left]=pivot; 19 return left; 20 } 21 //手动实现快排 22 void quicksort(ElementType *a,int left,int right){ 23 if(left<right){ 24 int pivotpos=partition(a,left,right); 25 quicksort(a,left, pivotpos-1); 26 quicksort(a,pivotpos+1,right);; 27 } 28 } 29 30 31 //qsort的比较函数 32 int compare(const void *lp,const void *rp){ 33 ElementType *l=(ElementType*)lp; 34 ElementType *r=(ElementType*)rp; 35 int result; 36 result=*l>*r?1:-1; 37 return result; 38 } 39 40 int main(){ 41 int n,i,j,currentlen=0,maxlen=0; 42 ElementType p; 43 scanf("%d %ld",&n,&p); 44 ElementType arrList[n]; 45 for(i=0;i<n;i++)scanf("%ld",&arrList[i]); 46 // quicksort(arrList,0,n-1); 47 qsort(arrList, n,sizeof(ElementType), compare); 48 for(i=0;i<n;i++){//从前到后找出每个位置开始的最长子列长度 49 for(j=i+currentlen;j<n;j++){//i+currentlen为已知最长完美数列的队尾下标+1 50 if(arrList[j]>arrList[i]*p){ 51 break; 52 } 53 currentlen=j-i+1;//元素i开始的完美队列当前长度 54 if(currentlen>maxlen)maxlen=currentlen;//如果当前子列的完美数列长度>已知的最大长度则更新 55 } 56 } 57 printf("%d",maxlen); 58 return 0; 59 }
PTA basic 1030 完美数列 (25 分) c语言实现(gcc)
原文:https://www.cnblogs.com/ichiha/p/14698734.html