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
code
/*
提交:1次 WA 理解错题意:求序列的最大数量而不是最大值
提交:2次 the last test WA lower_bound错误,改用upper_bound
提交:3次 the last test WA upper_bound()函数内查找的数值要long long型
*/
#include <stdio.h>
#include <algorithm>
using namespace std;
typedef long long ll;
const int maxn = 100005;
int a[maxn];
int main()
{
int n, p;
int maxn = 0;
scanf("%d%d",&n,&p);
for(int i = 0; i < n; ++i){
scanf("%d",&a[i]);
}
sort(a, a + n);
for(int i = 0; i < n; ++i){
//long long num = a[i] * p;
int pos = upper_bound(a + i + 1, a + n, (long long)a[i]*p) - a;
maxn = max(maxn, pos - i);
}
printf("%d",maxn);
return 0;
}
note1
- 下面这种写法使最后一个test错误
long long num = a[i] * p;
int pos = upper_bound(a + i + 1, a + n, num) - a;
- 必须下面这样写
int pos = upper_bound(a + i + 1, a + n, (long long)a[i]*p) - a;
- 猜测是因为该函数自动将num作为整型处理,即使它是一个长整型,因此需要进行强制转换;或者将数组a和参数p均定义为long long
note2
- 这道题用二分查找,而lower_bound和upper_bound自带的利用二分查找的库函数
- 关于lower_bound()和upper_bound()
- 由于前者是查找第一个大于或等于num的数,而num的值在序列中可能不止一个,如果使用lower_bound可能会使最终答案缩小
- upper_bound()查找第一个大于num的数,这样的话只需将找到的数组长度-1即为答案
- 补充:https://blog.csdn.net/qq_40160605/article/details/80150252
参考
- https://blog.csdn.net/weixin_42671353/article/details/82252997
- https://blog.csdn.net/Imagirl1/article/details/82318090
其他(手写二分)*