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 Mm×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 (≤) is the number of integers in the sequence, and p (≤) is the parameter. In the second line there are N positive integers, each is no greater than 1.

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>
using namespace std;

int binarysearch(int a[], long long x,int size,int i)
{//查找第一个大于x的数的位置
    int left = i+1, right = size-1, mid;
    if(a[size-1]<=x)
        return size;
    while(left < right)
    {
        mid = (left + right)/2;

        if(a[mid]<=x)
            left = mid+1;
        else
            right = mid;
    }

    return left;
}

int main()
{
    long long n,p;
    scanf("%lld %lld",&n,&p);

    int a[n];
    for(int i=0;i<n;i++)
    {
        scanf("%d",&a[i]);
    }

    sort(a,a+n);

    int cnt =0;
    for(int i=0;i<n;i++)
    {
//i从0——n-1,寻找大于p*a[i]的数在数组中的下标
int j = binarysearch(a,a[i]*p,n,i)-i;//a[i]是最小值 if(cnt<j) cnt = j; } cout<<cnt; return 0; }

解法二:two_point大法

#include<iostream>
#include<algorithm>
using namespace std;

int main()
{
    int n,p;
    scanf("%d %d",&n,&p);

    long long a[n];
    for(int i=0;i<n;i++)
    {
        cin>>a[i];
    }

    sort(a,a+n);
    int cnt =1;
    int i=0,j=0;//i,j是两个下标或者说是指针,i,j分别向右边移动
    while(i<n&&j<n)
    {
        while(j<n&&a[j]<=a[i]*p)//满足条件j就往后移动
        {

            cnt=max(cnt,j-i+1);//cnt取最大值,所以j不需要从i+1开始
            j++;
        }
        i++;

    }

    printf("%d",cnt);

    return 0;

}
原文地址:https://www.cnblogs.com/qinmin/p/12771174.html