給定乙個正整數數列,和正整數 p,設這個數列中的最大值是 m,最小值是 m,如果 m≤mp,則稱這個數列是完美數列。
現在給定引數 p 和一些正整數,請你從中選擇盡可能多的數構成乙個完美數列。
輸入第一行給出兩個正整數 n 和 p,其中 n(≤105)是輸入的正整數的個數,p(≤109)是給定的引數。第二行給出 n 個正整數,每個數不超過 109。
在一行中輸出最多可以選擇多少個數可以用它們組成乙個完美數列。
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 是給定的引數。第...