PAT 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
思路很简单。对于一个已经排序好的数列,找到不大于,这个数列最小元素乘以P的元素个数。
但要注意两点,
1.不用每次都从选定数列的首元素可以找,因为当前数列首元素一定大于上一个数列的首元素,可以从上个数列找到的元素个数位置开始找。
2.最大元素个数要在每次j++时判断。不能找得到大于最小元素乘以P的元素位置时判断,因为可能所有元素都小于最小元素乘以P元素
1 #include<stdio.h> 2 #include<string.h> 3 #include<stdlib.h> 4 int cmp(const void* a,const void* b){ 5 return *(double*) a>*(double*) b?1:-1; 6 } 7 int main(){ 8 int n,p; 9 scanf("%d %d",&n,&p); 10 double a[100100]; 11 for(int i=0;i<n;i++){ 12 scanf("%lf",&a[i]); 13 } 14 int max = 0; 15 int count = 0; 16 qsort(a,n,sizeof(a[0]),cmp); 17 double temp; 18 int i,j; 19 for(i=0;i<n;i++){ 20 temp = a[i]*p; 21 for(j=count;j<n;j++){ 22 if(a[j]>temp){ 23 break; 24 } 25 if(j-i>=max) 26 max = j-i+1; 27 28 } 29 count = j; 30 31 } 32 printf("%d",max); 33 }