PAT 乙級1030 完美數列 25 C 版

2022-03-21 19:40:16 字數 1530 閱讀 1235

時間限制

300 ms

記憶體限制

65536 kb

**長度限制

8000 b

判題程式

standard

作者cao, peng

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

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

輸入格式:

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

輸出格式:

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

輸入樣例:

10 8

2 3 20 4 5 1 6 7 8 9

輸出樣例:
8

誤區:將第乙個作為最小值求結果,這個誤區困擾了好久,說起來還是被例子繞暈了

比如說10 8

1 3 9 11 15 17 18 18 19 20

這個答案就是9,從3開始的 3 9 11 15 17 18 18 19 20

思路:這題使用multiset容器最合適不過了,再求最大數目時,我們可以減少迴圈次數,比如

10 8

1 3 5 7 9 10 15 20 25 30

在將1作為最小之後,得出最大為4,在9處失敗,

下一次將3做最小時,直接從9開始比對,因為第二個數大於等於第乙個數(公升序)

但是要將num減1,因為最小值右移一位了

從而節省了之前比對的次數

1

: 定義控制台應用程式的入口點。2//

34 #include "

stdafx.h

"5 #include6 #include7 #include89

using

namespace

std;

1011

intmain()

1224

25 multiset::iterator i, j, t=s.begin(), begin = s.begin(), end =s.end();

26int k , size =s.size();

2728

for (k=1,i = begin; k<=size; ++k,++i)

2937

38 t = j;//

保留此次失敗位置

3940

if (num >max_num)

41 max_num =num;

4243 --num;//

因下一次迴圈是set裡的數向後一位,所以減144}

4546 cout << max_num <4748

return0;

49 }

PAT 乙級 1030 完美數列 25

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

PAT乙級 1030 完美數列 25

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

PAT 乙級 1030 完美數列(25)

時間限制 300 ms 記憶體限制 65536 kb 長度限制 8000 b 判題程式 standard 作者 cao,peng 給定乙個正整數數列,和正整數p,設這個數列中的最大值是m,最小值是m,如果m m p,則稱這個數列是完美數列。現在給定引數p和一些正整數,請你從中選擇盡可能多的數構成乙個...