PAT 甲級 1085 Perfect Sequence (25 分) +二分相關知識

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

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<algorithm>

對於一個數組 a[]    要求a[] 數組有序

upper_bound(a+i,a+j,x)-a    //返回第一個大於x的數的位置

low_bound(a+i,a+j,x)-a        //返回的是第一個大於等於x的數的位置

 a[]={1,2,3,4,4,4,4,5}

upper_bound(a,a+8,4)      //返回7

low_bound(a,a+8,4)         //返回3

這兩個算法其實是採用的二分查找  

upper_blound
 

void uppper_blound(int l,int r,int x){
      while(l<r){
        int mid=(r-l)/2;
        if(a[mid]>x) r=mid;
        else  l=mid+1;
    }
}

low_bound

void low_bound(int l,int r,int x){
   while(l<r){
       int mid=(r-l)/2;
       if(a[mid]>=x) r=mid;
       else l=mid+1;
    }
}

附上一個STL裏的二分

https://blog.csdn.net/nisxiya/article/details/44945441

我的代碼:

#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
int cmp(long long a,long long b)
{
	return a<b;
}

long long a[100005];
int main()
{
	int n,p,i,j,cnt=0;
	long long temp=0;
	cin>>n>>p;
	for(i=0;i<n;i++)
	cin>>a[i];
	sort(a,a+n,cmp);
	for(i=0;i<n;i++)
	{
		temp=a[i]*p;
		j=upper_bound(a+i+1,a+n,temp)-(a+i);
		cnt=max(j,cnt);
	}
	cout<<cnt<<endl;
	return 0;
}

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章