PAT Basic 1030
阿新 • • 發佈:2018-08-11
個數 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( inti = 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