乙級 PAT 1030. 完美數列(25)
阿新 • • 發佈:2019-02-18
給定一個正整數數列,和正整數p,設這個數列中的最大值是M,最小值是m,如果M <= m * p,則稱這個數列是完美數列。
現在給定引數p和一些正整數,請你從中選擇儘可能多的數構成一個完美數列。
輸入格式:
輸入第一行給出兩個正整數N和p,其中N(<= 105)是輸入的正整數的個數,p(<= 109)是給定的引數。第二行給出N個正整數,每個數不超過109。
輸出格式:
在一行中輸出最多可以選擇多少個數可以用它們組成一個完美數列。
輸入樣例:10 8 2 3 20 4 5 1 6 7 8 9輸出樣例:
8
思路:先對陣列進行遞增排序,設定兩個下標,分別代表完美數列的開頭和結尾。注意:開頭指標向下進行遍歷,這個時候結尾指標只需從原位置開始向下遍歷即可。num[j] <= num[i] * p
#include<cstdio> #include<algorithm> using namespace std; int main() { int N, p; scanf("%d%d", &N, &p); int num[100000]; for (int i = 0; i < N; i++) { scanf("%d", &num[i]); } sort(num, num + N); int count = 1; int i = 0, j = 0; while (i < N) { while (j < N&&num[j] <= (long long)num[i] * p) { count = max(count, j - i + 1); j++; } i++; } printf("%d\n", count); return 0; }