这道题我只用了一次遍历,遗憾的是最后一个测试点无法通过,看到有人说最后一个测试点是大数问题,改了数据类型仍然不行,心累。
由于涉及最大最小问题,先对整个数组排序。从第一个元素开始标记,对以后的每个元素进行条件判断,当不满足题目条件,对标记+1,记录此时的数据个数,同时遍历并不需要暂停。这样遍历完成后有一个漏洞就是,如果所有数据满足第一个元素的判定条件,就没有记录数据个数,此时max=0,对这个用If判断,强制赋值N。
#include <iostream>
#include <algorithm>
using namespace std;
int main(){
long p,num[100001];
int N,count=1,max=0,L=0;
cin>>N>>p;
for(int i=0;i<N;i++) cin>>num[i];
sort(num,num+N);
for(int i=1;i<N;i++){
if(num[L]*p<num[i]){
if(i-L>max) max=i-L;
L++;
}
}
if(max==0) max=N;
cout<<max;
return 0;
}