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.
輸入描述:
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.
輸出描述:
For each test case, print in one line the maximum number of integers that can be chosen to form a perfect subsequence.
輸入例子:
10 8
2 3 20 4 5 1 6 7 8 9
輸出例子:
8
#include <stdio.h>
#include <stdlib.h>
void ReadData (int *data, int n) {
int i;
for (i=0; i<n; ++i)
scanf("%d", &data[i]);
}
int QuickSort (int* data, int n, int pNum) {
int pNumCount = 0;
int temp = data[0];
int front = 0;
int back = n-1;
while (back > front) {
while (back > front && data[back] >= pNum) {
if (data[back] == pNum)
pNumCount++;
back--;
}
if (back == front)
break;
data[front] = data[back];
front++;
while (back > front && data[front] < pNum) {
front++;
}
if (back == front)
break;
data[back] = data[front];
back--;
}
return front+pNumCount;
}
int FindResult(int* data, int n, int p) {
int min = 0;
int i;
for (i=1; i<n; ++i) {
if (data[min] < data[i])
min = i;
}
int pNum = p * data[min];
int max = min;
for (i=0; i<n; ++i) {
if (data[i] <= pNum && data[max] < data[i])
max = i;
}
int temp = data[0];
data[0] = data[max]
data[max] = temp;
return QuickSort(data, n, pNum);
}
int main(int argc, char* argv[]) {
int N, p;
scanf("%d", &N);
scanf("%d", &p);
int *data = (int *)malloc(sizeof(int) * N);
ReadData(data, N);
int result = FindResult(data, N, p);
printf("%d", result);
}