1030. 完美数列
给定⼀个正整数数列,和正整数p,设这个数列中的最⼤值是M,最⼩值是m,如果M <= m * p,则称 这个数列是完美数列。
现在给定参数p和⼀些正整数,请你从中选择尽可能多的数构成⼀个完美数列。
输⼊格式:
输⼊第⼀⾏给出两个正整数N和p,其中N(<= 105)是输⼊的正整数的个数,p(<= 109)是给定的参 数。第⼆⾏给出N个正整数,每个数不超过109。
输出格式:
在⼀⾏中输出最多可以选择多少个数可以⽤它们组成⼀个完美数列。
输⼊样例:
10 8 2 3 20 4 5 1 6 7 8 9
输出样例:
8
分析:
先对数列从小到大排序
#include<bits/stdc++.h>
using namespace std;
int main(){
int n;
long long p;
cin>>n>>p;
vector<int> v(n);
for(int i=0;i<n;i++) cin>>v[i];
sort(v.begin(),v.end());
int result=0,temp=0;
for(int i=0;i<n;i++){
//因为result保存的是目前的最大值,比result小的就不用再判断了
for(int j=i+result;j<n;j++){
if(v[j]<=v[i]*p){
temp=j-i+1;
if(temp>result) result=temp;
}else{
break;
//跳出内层循环后,i++,
}
}
}
cout<<result;
return 0;
}
版本二:
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
typedef long long int LL;
LL a[N];
int main(){
LL n,p; cin>>n>>p;
for(int i=0;i<n;i++) cin>>a[i];
sort(a,a+n);
int ans=0;
//j慢,i快,a[j]表示最小值,a[i]表示最大值
for(int i=0,j=0;i<n;i++){
//当最小值*p小于最大值时,说明不满足条件,慢指针++
while(a[j]*p<a[i]) j++;
ans=max(i-j+1,ans);
}
cout<<ans<<endl;
return 0;
}