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 <stdio.h> #include <algorithm> using namespace std; long long int list[100010]; int N, p; int fun(int num) { long long int temp = list[num] * p; int a = -1, b = N, mid; while(b - a > 1) { mid = (a + b) / 2; /*if(temp == list[mid]) { break; }*/ if(temp < list[mid]) { b = mid; } else { a = mid; } } return b - num; } int main() { while(scanf("%d %d", &N, &p) != EOF) { for(int i = 0; i < N; i++) { scanf("%d", &list[i]); } sort(list, list + N); int max = 0, res = 0; for(int i = 0; i < N; i++) { if(list[i] > list[N - 1] / p || (list[N - 1] / p == 0 && list[i] == list[N - 1] / p)) { res = N - i; max = max < res ? res : max; break; } res = fun(i); max = max < res ? res : max; } printf("%d\n", max); } return 0; }