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