時間限制
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和一些正整數,請你從中選擇盡可能多的數構成乙個...