1030 完美数列(25)(25 分)
给定一个正整数数列,和正整数p,设这个数列中的最大值是M,最小值是m,如果M <= m * p,则称这个数列是完美数列。
现在给定参数p和一些正整数,请你从中选择尽可能多的数构成一个完美数列。
输入格式:
输入第一行给出两个正整数N和p,其中N(<= 10^5^)是输入的正整数的个数,p(<= 10^9^)是给定的参数。第二行给出N个正整数,每个数不超过10^9^。
输出格式:
在一行中输出最多可以选择多少个数可以用它们组成一个完美数列。
输入样例:
10 8
2 3 20 4 5 1 6 7 8 9
输出样例:
8
有一个大数case,如果每轮都依次比较结果必超时,分析发现
假设这一次最小为a,最大为b,显然在a–b之间的所有数c[i]均符合c[i]
#include<iostream>
#include<algorithm>
#define max 100001
using namespace std;
int a[max];
int main(){
int N,p,count=0,q,j,tmp,i;
cin>>N>>p;
tmp=0x7fffffff/p;//咳咳,这里是用双重for的历史遗留问题,tmp,q和下面的判断可以去掉
for(q=0;q<N;++q){
scanf("%d",&j);
if(j<=tmp)
a[q]=j;
}
sort(a,a+q);
for(int i=0,j=1;j<q;++j){
if(a[j]>a[i]*p){
if(j-i>count) count=j-i;
i++;
}
}
if(count==0)count=q;
cout<<count;
return 0;
}