1. 程式人生 > >PAT Basic 1030

PAT Basic 1030

個數 strong scan 之前 esp ostream 擔心 一次循環 時間

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