PAT1030 完美数列
2017-04-14 15:25
267 查看
给定一个正整数数列,和正整数p,设这个数列中的最大值是M,最小值是m,如果M <= m * p,则称这个数列是完美数列。
现在给定参数p和一些正整数,请你从中选择尽可能多的数构成一个完美数列。
输入格式:
输入第一行给出两个正整数N和p,其中N(<= 105)是输入的正整数的个数,p(<= 109)是给定的参数。第二行给出N个正整数,每个数不超过109。
输出格式:
在一行中输出最多可以选择多少个数可以用它们组成一个完美数列。
输入样例:
输出样例:
8
本题是最后一道大题,最后的AC代码只有30多行,用到了快速排序,对大数组定义的一些细节考察,节省运行时间的一些技巧都有涉及,是一道比较综合的题目。
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位全部来存储这个数。
现在给定参数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位全部来存储这个数。
相关文章推荐
- PAT 乙等 1030 完美数列
- PAT_乙级 1030 完美数列
- PAT1030完美数列
- 完美数列(PAT-1030)
- pat1030完美数列bug总结,
- PAT 乙级 1030.完美数列
- PAT1030完美数列(25)
- PAT 1030 OA信用盘搭建出租维护完美数列
- PAT1030 完美数列(25)
- PAT 1030 完美数列(25)
- PAT 1030完美数列
- Python实现PAT1030 完美数列
- [PAT-乙级]1030.完美数列
- PAT 1030 完美数列(25)
- Pat(Basic Level)Practice--1030(完美数列)
- PAT乙级1030完美数列
- PAT 1030完美数列
- PAT乙级1030 完美数列
- PAT(basic level) 1030 完美数列(25)
- PAT(Basic Level)_1030_完美数列