给定一个正整数数列,和正整数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<cstdio> #include<algorithm> using namespace std; const int maxn=1010; int N,p,A[maxn]; int search(int i,long long x){ if(A[N-1]<x) return N; int left=i+1,right=N-1; while(left<right){ int mid=(left+right)/2; if(A[mid]>x) //用if(A[mid]>x) right=mid-1; right=mid; //else left=mid; else //不能输出; left=mid+1; //因为比如1,2,3,4,5,6,7,8到左后left一直为7,right一直为8; } return left; } int main(){ scanf("%d%d",&N,&p); int i,j,sum=1; for(i=0;i<N;i++) { scanf("%d",&A[i]); } sort(A,A+N); for(i=0;i<N;i++){ j=search(i,(long long)A[i]*p); sum=max(sum,j-i); } printf("%d",sum); return 0; }
#include<cstdio> #include<algorithm> using namespace std; const int maxn=1010; int N,p,A[maxn]; int main(){ scanf("%d%d",&N,&p); int i,j; long long x; for(i=0;i<N;i++) { scanf("%d",&A[i]); } sort(A,A+N); int count=1; for(i=0;i<N;i++){ x=(long long)A[i]*p; for(j=i+count;j<N;j++){ if(A[j]>x) break; count++; } } printf("%d",count); return 0; }