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

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值