PAT甲级 A1085

PAT甲级 A1085

解题思路

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

解题思路

二分查找。注意使用longlongint防止超出

#include<iostream>
#include<vector>
#include<string>
#include<set>
#include<algorithm>
#include<map>
#include<vector>
#include<iomanip>
#include<queue>
#include<cmath>
using namespace std;
vector<long long int> seq;
int N; int p;
const int MaxN = 100010;
bool condi(long long int a, long long int b) {
	return a <= b * p;
}
int main(){
	cin >> N >> p;
	for (int i = 0; i < N; i++) {
		long long int temp;
		scanf_s("%d", &temp);
		seq.push_back(temp);
	}
	sort(seq.begin(), seq.end());
	int maxsize = 0;
	for (int i = 0; i < seq.size(); i++) {
		long long int temp = seq[i] * p;
		if (seq[seq.size() - 1] <= temp) {
			int newsize = seq.size() - i;
			maxsize = max(newsize, maxsize);
			continue;
		}
		int left = i + 1; int rights = seq.size() - 1;
		while (left<rights) {
			int mid = (left + rights) / 2;
			if (seq[mid] < temp) {
				left = mid+1 ;
			}
			else if (seq[mid] == temp) {
				left = mid+1;
				break;
			}
			else {
				rights = mid-1;
			}
		}
		int newsize = left - i ;
		maxsize = max(newsize, maxsize);
	}
	cout << maxsize << '\n';
}

看到一位博主关于二分查找的总结 很不错

//二分上下界为左闭右闭的[l,r],求第一个满足条件的元素位置 
int binery_search(int a[],int l,int r,int x){
	while(l<r){
		int mid=(l+r)/2;
		if(条件成立){
		    right=mid;
		}else{
		    l=mid+1;
		}
	}
	return l;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值