1. 程式人生 > >1030 完美數列 Python實現

1030 完美數列 Python實現

1030 完美數列(25)(25 分)

給定一個正整數數列,和正整數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

問題分析:將輸入的數列升序排序,分別以數列中的元素做為最小值,計算可以構成的最大完美數列,輸出其中最大值(雙層迴圈)。該演算法會有測試項超時。

改進方法:在分別計算最大完美數列時,如果以當前值為最小值,其最大完美數列長度比已知最大長度更長,那麼長度至少大一。那麼對當前值的判斷可以直接與從當前位置後移max+1的位置的值,若不匹配,那麼它不可能超過最大值,若匹配,再從該位置向後計算。

程式:

n,p = [int(i) for i in input().split()]
b = sorted([int(i) for i in input().split()])
m = 0
for i in range(n):
	for j in range(i+m,n):
		if b[i]*p<b[j]:
			break
		m+=1
print(m)