1085. Perfect Sequence (25)-PAT甲级真题

1085. Perfect Sequence (25)

时间限制
300 ms
内存限制
65536 kB
代码长度限制
16000 B
判题程序
Standard
作者
CAO, Peng

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 <iostream>
#include <algorithm>
#include <vector>
using namespace std;
vector<int> V;
int main()
{
    int n,cnt=0;
    long p;
    cin >> n >> p;
    long temp;
    long max = 0;
    if (n == 0)
    {
        cout << n;
        return 0;
    }
    V.resize(n);
    for (int i = 0; i < n; i++)
    {
        cin >> V[i];
    }
    sort(V.begin(), V.end());
    for (int i = 0; i < n; i++)
    {
        for (int j = i + max; j <= n - 1; j++)
        {
            if (V[i] * p >= V[j]){
                if (max < j - i + 1)
                    max = j - i + 1;
            }
            else break;//剪枝非常重要
        }
    }
    cout << max;
}

1 该题使用递归寻找解空间时时间空间都爆炸,不可使用。递归迭代每个问题都可思考解法。但在n数值大时,时间空间不可接受。

2 针对最大最小值相关的问题可以用排序解决。

3 适当剪枝减小开销。

 

 

posted @ 2017-08-26 17:33  forjiuzhou  阅读(188)  评论(0编辑  收藏  举报