牛客网PAT乙级真题 完美数列(25)

牛客网PAT乙级真题 完美数列(25)

时间限制 1000 ms 内存限制 32768 KB 代码长度限制 100 KB 判断程序 Standard (来自 小小)
题目描述
给定一个正整数数列,和正整数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

AC代码如下:

#include<stdio.h>
#include<stdlib.h>
//嘤嘤嘤,只有最后一个例子超时了!
int cmp(const void *a,const void *b)
{
    if( *(long *)a!=*(long *)b ) return *(long *)a-*(long *)b;
    else return 1;
}
int main()
{
    long a[100001];
    int N,p,len,i,j;
    scanf("%d%d",&N,&p);
    for(i=0;i<N;i++) scanf("%ld",&a[i]);
    qsort(a,N,sizeof(a[0]),cmp);        //已经排序完成

    for(len=1,i=0;i<N-len;i++)
    {
        int templen=len-1;
        for(j=i+len;j<N;j++)
        {
            if(a[j]<=a[i]*p)
                templen++;
            else break;//哎呀呀!就是加了这一句,最后一个case才过的
        }//时间复杂度真的很重要!
        if(templen>len)len=templen+1;
    }
    printf("%d\n",len);
    return 0;
}

发布了18 篇原创文章 · 获赞 2 · 访问量 222

猜你喜欢

转载自blog.csdn.net/zhou_hao_ran/article/details/103788856