1030. 完美数列(25)

xiaoxiao2021-02-27  194

1030. 完美数列(25)

时间限制 300 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CAO, Peng

给定一个正整数数列,和正整数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<stdio.h> #include<algorithm> using namespace std; int a[100010],n,p; //找出第一个大于x的数 int lower_bound(int i,long long x) { if(a[n-1]<=x) return n;//都小于x则返回n int mid,left=i+1,right=n-1;//在[i+1,n-1]中查找 while(left<right) { mid=left+(right-left)/2; if(x>=a[mid])//如果x<a[mid]则说明第一个大于x的数还在mid之前 { left=mid+1; } else { right=mid; } } return left; } int main() { scanf("%d%d",&n,&p); for(int i=0;i<n;i++) { scanf("%d",&a[i]); } sort(a,a+n); int ans=1; for(int i=0;i<n;i++) { int j=lower_bound(i,(long long) a[i]*p ); ans=max(ans,j-i); } printf("%d\n",ans); return 0; }或者如下写法: #include<stdio.h> #include<algorithm> using namespace std; const int maxn=100010; int a[100010],n,p; int main() { scanf("%d%d",&n,&p); for(int i=0;i<n;i++) { scanf("%d",&a[i]); } sort(a,a+n); int ans=1; for(int i=0;i<n;i++) { int j=upper_bound(a+i+1,a+n,(long long) a[i]*p )-a; ans=max(ans,j-i); } printf("%d\n",ans); return 0; }

转载请注明原文地址: https://www.6miu.com/read-11955.html

最新回复(0)