PAT1030.——完美数列

给定一个正整数数列,和正整数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;
}
原文地址:https://www.cnblogs.com/Traveller-Leon/p/4972423.html