zoukankan      html  css  js  c++  java
  • 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;
    
    }
  • 相关阅读:
    ZOJ 3818 Pretty Poem
    HDU 4597 Play Game
    HDU 4497 GCD and LCM
    CSU 1335 高桥和低桥
    UVA 10791 Minimum Sum LCM
    CSU 1119 Collecting Coins
    CSU 1120 病毒
    UVA 12169 Disgruntled Judge
    HDU 1301 Jungle Roads
    POJ 1258 Agri-Net
  • 原文地址:https://www.cnblogs.com/qinmin/p/12771174.html
Copyright © 2011-2022 走看看