1085. Perfect Sequence (25)
Given a sequence of positive integers and another positive integer p. The sequence is said to be a "perfect sequence" if M <= m * p where M and m are the maximum and minimum numbers in the sequence, respectively.
Now given a sequence and a parameter p, you are supposed to find from the sequence as many numbers as possible to form a perfect subsequence.
Input Specification:
Each input file contains one test case. For each case, the first line contains two positive integers N and p, where N (<= 105) is the number of integers in the sequence, and p (<= 109) is the parameter. In the second line there are N positive integers, each is no greater than 109.
Output Specification:
For each test case, print in one line the maximum number of integers that can be chosen to form a perfect subsequence.
Sample Input:10 8 2 3 20 4 5 1 6 7 8 9Sample Output:
8
#include <cstdio>
#define SIZE 100005
//TO speed up, we can use libarary function sort(a,a+n), which exists in <algorithm>
//
//
//
//
//
int a[SIZE];
void swap(int &a,int&b){
int tmp=a;
a=b;
b=tmp;
}
int partion(int a[],int low,int high){
int key= (low+high)/2;
swap(a[key],a[high]);
int i,j;
i=low;
j=high-1;
while(1){
while(i<high &&a[i]<=a[high])
i++;
while(j>=low &&a[j] > a[high])
j--;
if(i>=j)
break;
else
swap(a[i],a[j]);
}
swap(a[i],a[high]);
return i;
}
void myqsort(int a[],int low,int high){
if(low < high){
int key=partion(a,low,high);
myqsort(a,low,key-1);
myqsort(a,key+1,high);
}
}
int main()
{
int N,i,j;
int p;
int count=0;
scanf("%d%d",&N,&p);
for(i=0;i<N;i++)
scanf("%d",&a[i]);
myqsort(a,0,N-1);
for(i=0;i<=N-count;i++){
for(j=i+count;j<N;j++){
if(a[j] <= a[i]*(long long)p) //in case the result will overflow,we must first convert the data type
continue; //(long long)(a[i]*p) is invalid PLEASE TAKE CARE!!!!!!
else
break;
}
if(j-i>count)
count=j-i;
}
printf("%d\n",count);
return 0;
}