问题描述
找出在输入数组中满足最大值<=最小值*参数p的最长序列。
题目分析
先介绍一下C++中upper_bound()这个函数:假设有数组a
upper_bound(a+i,a+j,x) - a返回的是数组a中第一个大于x的位置(注意:这里返回的是一个具体的位置)。
所以我们想,如果我们遍历数组,从不同位置出发,如果可以找到第一个大于m*p的位置,那么这个位置-起始位置不就是我们序列的长度了嘛
代码
#include<iostream>
#include <algorithm>
using namespace std;
const int maxn = 100010;
int n, p, a[maxn];
int main()
{
scanf("%d%d", &n, &p);
for(int i = 0; i < n; i++){
scanf("%d", &a[i]);
}
sort(a, a+n);
int ans = 1;
for(int i = 0; i < n; i++){
//upper_bound返回的是第一个大于a[i]*p的元素指针
//a表示数组的头指针,不指向任何元素,那么我们就需要对其进行+1,让其指向第一个元素,然后查找第一个大于a[i]*p的元素指针
//用这个指针减去头指针a就是这个指针所在的数组索引
//再用这个值-i即可得到这一段序列长度,例如5-2=3,因为索引5已经大于了a[i]*p,所以序列长度为3
int j = upper_bound(a+i+1, a+n, (long long)a[i]*p) - a;
ans = max(ans, j-i);
}
printf("%d\n", ans);
return 0;
}
答题用时15min
Q30——finish√