题目
https://pintia.cn/problem-sets/994805342720868352/problems/994805381845336064
代码逻辑
先排序,排序后的数组的每一个连续子序列的开头和结尾就是最小值和最大值。
所以从头遍历,在固定开头位置(最小值)后,通过upper_bound函数,二分查找第一个大于num的数字,那么该数字的前一个位置与开头位置组成的数列就是完美数列,最后比较个数选出最大的即可。
注意
因为p小于109 ,p乘上一个int类型的整数是要超过int本身的取值范围的(int取值范围为-2147483648 - 2147483647),所以我为了方便就把相关变量都设为long long了
AC代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
ll n,p,maxn=0;
cin>>n>>p;
ll a[n];
for(int i=0;i<n;i++)
cin>>a[i];
sort(a,a+n);
for(int i=0;i<n;i++)
{
ll pos=upper_bound(a+i,a+n,a[i]*p)-a;
if(pos-i>maxn) maxn=pos-i;
}
cout<<maxn;
}