PAT Basic 1030
Posted yxp400
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PAT Basic 1030相关的知识,希望对你有一定的参考价值。
1030 完美数列
给定一个正整数数列,和正整数p,设这个数列中的最大值是M,最小值是m,如果M <= m * p,则称这个数列是完美数列。
现在给定参数p和一些正整数,请你从中选择尽可能多的数构成一个完美数列。
输入格式:
输入第一行给出两个正整数N和p,其中N(<= 10^5^)是输入的正整数的个数,p(<= 10^9^)是给定的参数。第二行给出N个正整数,每个数不超过10^9^。
输出格式:
在一行中输出最多可以选择多少个数可以用它们组成一个完美数列。
输入样例:
10 8
2 3 20 4 5 1 6 7 8 9
输出样例:
8
题解:这道题目看起来不难,但是N和P的数据量较大,导致需要使用long long int 进行计算,并且需要担心超时的问题。不过还好这道题给的
时间限制相对还是比较宽松的,只需要在暴力的基础上稍作修改就能跑过所有测试点。
暴力的话,自然就是先排序,然后写一个双重嵌套循环,然后找到符合条件的最大值即可,在此基础上,我们发现是要寻找最大值,那么每一次
我们只有在满足之前的最大值时,才进行这一次循环,即可减少时间复杂度,详见代码。
代码如下:
1 #include<iostream> 2 #include<algorithm> 3 using namespace std; 4 5 int main() 6 { 7 long long int n, p, a[1000001]; 8 int result = 0; 9 scanf("%lld %lld", &n, &p); 10 for( int i = 0; i < n; i++) scanf("%lld",&a[i]); 11 sort(a,a+n); 12 for( int i = 0; i < n; i++){ 13 for( int j = i + result; j < n; j++){ 14 if( a[j] > a[i]*p) 15 break; 16 if( j - i + 1 > result) 17 result = j - i + 1; 18 } 19 } 20 printf("%d",result); 21 return 0; 22 }
以上是关于PAT Basic 1030的主要内容,如果未能解决你的问题,请参考以下文章