PAT--完美数列-快速搜索

来源:互联网 发布:环保产业发展现状数据 编辑:程序博客网 时间:2024/05/16 00:35
 给定一个正整数数列,和正整数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>#define MAX 100005long long  num[MAX];void quicksort(int left ,int right){//先用快速排序对所给的数进行排序,快排怎么写要记住    if(left>right)    return;    long long i,j,temp;    i=left;    j=right;    temp=num[left];    while(i!=j){        while(num[j]>=temp&&i<j)            j--;        while(num[i]<=temp&&i<j)            i++;        if(i<j){            num[i]=num[i]^num[j];            num[j]=num[j]^num[i];            num[i]=num[i]^num[j];        }            }    num[left]=num[i];    num[i]=temp;    quicksort(left,i-1);    quicksort(i+1,right);    return;}long long main(void){    long long n,p;    scanf("%lld",&n);    scanf("%lld",&p);    long long i=0;    while(i!=n){        scanf("%lld",&num[i++]);    }    quicksort(0,i-1);    long long j,k,sum,record=0;    for(j=0;j<=i-record;++j){//record记下每次找到的长度,那么最后的长度没有record那么长就不用去找了,浪费时间        sum=record;        for(k=j+record;k<i;++k){//同理,既然已经有record,那么下一个就可以跳过record长度来查找            if(num[j]*p>=num[k])                sum++;            else            break;//这才是运行超时的关键,既然没找到比num[j]*p大的,那就必须break;否则完全全是在浪费时间        }        if(record<sum)        record=sum;    }    printf("%lld\n",record);    return 0;}  


0 0
原创粉丝点击