PAT-ADVANCED-1085-Perfect Sequence

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 9

Sample Output:

8

#include <bits/stdc++.h>
#define LL long long
using namespace std;

LL n, p;
vector<LL> arr;
bool cmp(const LL &a, const LL &b){
    return a < b;
}
int  main(){
    LL res = 1;
    scanf("%lld%lld", &n, &p);
    LL tmp;
    for(int i = 0; i < n; ++i){
        scanf("%lld", &tmp);
        arr.push_back(tmp);
    }
    sort(arr.begin(), arr.end(), cmp);
    for(int i = 0; i < n; ++i){
        LL pos = upper_bound(arr.begin(), arr.end(), arr[i]*p) - arr.begin();
        if(pos != -1){
            res = max(pos-i, res);
        }
        else{
            res = max(n-i, res);
            break;
        }
    }
    printf("%lld\n", res);
    return 0;
}
CAPOUIS'CODE

 

排序后,遍历数组的m,M通过二分查找获得,时间复杂度是O(NLogN)
LONG LONG这个地方又天真了....

 

posted @ 2015-09-08 23:05  CAPOUIS  阅读(278)  评论(0)    收藏  举报