给定一个正整数数列,和正整数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
一开始无脑O(n2)的超时,然后优化一下,j不用从i开始,继续从上次的地方开始,因为数组已经排好序了。少用一个变量就正确了,也是没有发现原来错在哪里。
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cctype> #include <cstdlib> #include<cmath> #include <string> #include <map> #include <set> #include <queue> #include <vector> #include <stack> #include <cctype> using namespace std; typedef unsigned long long ull; #define INF 0xfffffff long long a[100000]; int main() { long long n,x,y,i,j,k; memset(a,0,sizeof(a)); cin>>x>>y; for(i=0;i<x;++i) cin>>a[i]; sort(a,a+x); k=1; j=0; for(i=0;i<x;++i) { while(a[j]<=a[i]*y&&j<x) { ++j; } k=max(k,j-i); } cout<<k<<endl; return 0; }
时间: 2024-11-17 21:06:24