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;
    
    }
  • 相关阅读:
    EF在二手市场中的使用
    二手商城集成jwt认证授权
    core3商城DDD实战(一)建模
    数组的逆序对
    C++实现线程安全的单例
    分配格充要条件的两种证明
    一个简单的日历系统(C++)
    HTTP基础--网页基础
    HTTP基础 --响应
    HTTP基础--请求
  • 原文地址:https://www.cnblogs.com/qinmin/p/12771174.html
Copyright © 2011-2022 走看看