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 (≤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<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;
}