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