您的位置:首页 > 其它

PAT1030 完美数列

2017-04-14 15:25 267 查看
给定一个正整数数列,和正整数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代码只有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位全部来存储这个数。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: