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 }
 

猜你喜欢

转载自www.cnblogs.com/yxp400/p/9457608.html