1030 完美數列

2021-09-28 16:00:45 字數 3344 閱讀 9003

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

現在給定引數 p 和一些正整數,請你從中選擇盡可能多的數構成乙個完美數列。

輸入格式:

輸入第一行給出兩個正整數 n 和 p,其中 n(≤105)是輸入的正整數的個數,p(≤109)是給定的引數。第二行給出 n 個正整數,每個數不超過 109。

輸出格式:

在一行中輸出最多可以選擇多少個數可以用它們組成乙個完美數列。

輸入樣例1:

10 8

2 3 20 4 5 1 6 7 8 9

輸出樣例1:

8
總結:

按從小到大順序排好

外迴圈1:

1 2 3 4 5 6 7 8 9 20 max<=min*p ? (no) min指標移到下一位

↑ ↑

min max

1 2 3 4 5 6 7 8 9 20 max<=min*p ? (no) min指標移到下一位

↑ ↑

min max

1 2 3 4 5 6 7 8 9 20 max<=min*p ? (yes) 記錄有8個數

↑ ↑

min max

外迴圈2:

1 2 3 4 5 6 7 8 9 20 max<=min*p ? (no) min指標移到下一位

↑ ↑

min max

1 2 3 4 5 6 7 8 9 20 max<=min*p ? (yes) 記錄有8個數,(8<8)不更新

↑ ↑

min max

外迴圈3:

1 2 3 4 5 6 7 8 9 20 max<=min*p ? (yes) 記錄有8個數,(8<8)不更新

↑ ↑

min max

外迴圈4:

1 2 3 4 5 6 7 8 9 20 max-min指標之間只有7個數 小於8,退出迴圈,結束

↑ ↑

min max

改進:尋找min指標可以用二分法查詢

外迴圈1:

1 2 3 4 5 6 7 8 9 20 max<=mid*p ? (yes) mid指標到左半部分找

↑ ↑ ↑↑

sort_min mid sort_max,max

1 2 3 4 5 6 7 8 9 20 max<=mid*p ? (no) min指標移到右半部分

↑ ↑ ↑ ↑

mid sort_max max

sort_min

1 2 3 4 5 6 7 8 9 20 max<=mid*p ? (yes) mid指標到左半部分找

↑↑ ↑ ↑

sort_min sort_max max

mid

1 2 3 4 5 6 7 8 9 20 max<=mid*p ? (yes) mid指標到左半部分找

↑↑↑ ↑

max

下一步因為sort_min>sort_max 退出內迴圈 ,mid指向3; 判斷max<=mid*p ?(yes) 更新個數8

sort

(v.begin()

, v.

end())

;int max =0;

int max_flag = v.

size()

-1;for(;

(max_flag >=0)

&&(max_flag +

1> max)

; max_flag--

)else

if(v[max_flag]

> v[mid]

* p)

else}if

(v[max_flag]

<= v[mid]

* p)

}}

ac**:

#include

#include

#include

using

namespace std;

intmain()

sort

(v.begin()

, v.

end())

;int max =0;

int max_flag = v.

size()

-1;for(;

(max_flag >=0)

&&(max_flag +

1> max)

; max_flag--

)else

if(v[max_flag]

> v[mid]

* p)

else}if

(v[max_flag]

<= v[mid]

* p)}}

cout << max;

system

("pause");

return0;

}

1030 完美數列

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

1030 完美數列

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

1030 完美數列

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