1030 完美數列 25 分 詳解

2021-09-27 10:39:00 字數 856 閱讀 3620

給定乙個正整數數列,和正整數 p,設這個數列中的最大值是 m,最小值是 m,如果 m≤mp,則稱這個數列是完美數列。

現在給定引數 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
一開始理解錯了題意,認為可以先排序,然後得到最大的數,然後計數在它前面有多少個數乘p大於等於它,雖然這樣只會在乙個測試點得到wa,但是這並不是我們想要的。正確的做法應該是對陣列先進行排序(公升序),以樣例來說,排序完後,順序為:1,2,3,4,5,6,7,8,9,20;那麼選擇v[0]為最小數,乘p,那麼可以取的m的可以為1,2,3,4,5,6,7,8。一共有8個,假如進行第二次遍歷,從v[1]開始,那麼可以選擇便有2,3,4,5,6,7,8,9,共有8個。我們只需要這樣遍歷便可以得到最長的完美數列。

雙指標法:

第一次遍歷

ij,j指到這裡時退出,j還小於n,繼續遍歷,j-i=8;

第二次遍歷

ij,j指到這裡時退出,j=n,結束遍歷,j-i=8;01

2345

6789

1234

5678

920

while(jusing namespace std;

int main()

cout

}

1030 完美數列(25 分)

給定乙個正整數數列,和正整數 p,設這個數列中的最大值是 m,最小值是 m,如果 m mp,則稱這個數列是完美數列。現在給定引數 p 和一些正整數,請你從中選擇盡可能多的數構成乙個完美數列。輸入第一行給出兩個正整數 n 和 p,其中 n 10 5 是輸入的正整數的個數,p 10 9 是給定的引數。第...

1030 完美數列(25 分)

1030 完美數列 25 分 給定乙個正整數數列,和正整數 p,設這個數列中的最大值是 m,最小值是 m,如果 m mp,則稱這個數列是完美數列。現在給定引數 p 和一些正整數,請你從中選擇盡可能多的數構成乙個完美數列。輸入第一行給出兩個正整數 n 和 p,其中 n 10 5 是輸入的正整數的個數,...

1030 完美數列 (25 分)

給定乙個正整數數列,和正整數 p,設這個數列中的最大值是 m,最小值是 m,如果 m mp,則稱這個數列是完美數列。現在給定引數 p 和一些正整數,請你從中選擇盡可能多的數構成乙個完美數列。輸入第一行給出兩個正整數 n 和 p,其中 n 10 5 是輸入的正整數的個數,p 10 9 是給定的引數。第...