PAT1030 完美数列

来源:互联网 发布:燕十八mysql优化 编辑:程序博客网 时间:2024/06/08 09:22

给定一个正整数数列,和正整数p,设这个数列中的最大值是M,最小值是m,如果M <= m * p,则称这个数列是完美数列。

现在给定参数p和一些正整数,请你从中选择尽可能多的数构成一个完美数列。

输入格式:

输入第一行给出两个正整数N和p,其中N(<= 105)是输入的正整数的个数,p(<= 109)是给定的参数。第二行给出N个正整数,每个数不超过109

输出格式:

在一行中输出最多可以选择多少个数可以用它们组成一个完美数列。

输入样例:
10 82 3 20 4 5 1 6 7 8 9
输出样例:

8

本题是最后一道大题,最后的AC代码只有30多行,用到了快速排序,对大数组定义的一些细节考察,节省运行时间的一些技巧都有涉及,是一道比较综合的题目。

#include<stdio.h>#include<string.h>#include<stdlib.h>int cmp(const void* a,const void* b){    return *(double *) a>*(double *) b?1:-1;}int main(){    int n,p;    scanf("%d%d",&n,&p);    double a[100000]; //double的精度更高,取值范围更大,其实也可以用全局变量的long long,  long long 和double的区别在下文已写出    double temp;    for(int i = 0;i<n;i++)    {        scanf("%lf",&a[i]);     }    qsort(a,n,sizeof(double),cmp);  //用快排将输入数组的数字从小到大排序    int i = 0,j = 0,count = 0,max = 0;     //count是每次j开始的地方,max就是最大个数    for(;i<n;i++)                //最小数从a[0]开始一直更新    {        temp = a[i] * p;                  for(j=count;j<n;j++)              {            if(temp < a[j])       //j从count开始到数组结尾,遇到大于temp的数就break                break;            if(j-i+1 > max)       // j-i+1就是这次循环用到的数的个数,如果大于max,则将max更新                max = j-i+1;        }        count = j;                //因为前一个temp肯定大于等于a[j]之前的数,所有不必每次从第一个数开始判断.    }    printf("%d",max);}


double


        double是计算机使用的一种数据类型。比起单精度浮点数(float),double(双精度浮点数)使用 64 位(8字节) 来储存一个浮点数。 它可以表示十进制的15或16位有效数字,负值取值范围为 -1.7976E+308 到 -4.94065645841246544E-324,正值取值范围为 4.94065645841246544E-324 到 1.797693E+308。


        double在计算机中的存储方法:无论是单精度还是双精度在存储中都分为三个部分:


符号位(Sign) : 0代表正,1代表为负
指数位(Exponent):用于存储科学计数法中的指数数据,并且采用移位存储
尾数部分(Mantissa):尾数部分
        正是它不同于long long的存储方法,使得它虽然只有64位但是可以比同样是64位的long long 类型取值范围大很多。


long long 


        64位的范围应该是[-2^63 ,2^63],既-9223372036854775808~9223372036854775807。


        它的存储方法就是按位存储。有符号位就有一位符号位,没有符号位就64位全部来存储这个数。

1 0
原创粉丝点击