1030 完美數列 (25分)
給定乙個正整數數列,和正整數 p,設這個數列中的最大值是 m,最小值是 m,如果 m≤mp,則稱這個數列是完美數列。
現在給定引數 p 和一些正整數,請你從中選擇盡可能多的數構成乙個完美數列。
輸入格式:
輸入第一行給出兩個正整數 n 和 p,其中 n(≤10^ 5)是輸入的正整數的個數,p(≤10^9)是給定的引數。第二行給出 n 個正整數,每個數不超過 10 ^9。
輸出格式:
在一行中輸出最多可以選擇多少個數可以用它們組成乙個完美數列。
輸入樣例:
10 8
2 3 20 4 5 1 6 7 8 9
輸出樣例:
8時間限制200ms
想要徹底搞懂本題應該從頭寫起。為方便思考將n個數組成的數列從小到大排序,排序好的數列為。
結論:能使選出的數個數最大的方案,一定是在該遞增數列中選擇下標連續的若干個數的方案。
證明採用反證法:假設選出的方案下標不連續,則還可在中間增加若干數使其長度變長,同時保證滿足題目要求,於是假設不成立。得證。
例子:假設從中選出個數最多的方案為,ai,ai+1…ai+m下標連續,與aj不連續,則可在ai+m和aj之間加入若干數,使其下標連續,長度變長,而最小值ai和最大值aj不變,故aj<=ai*p仍然成立。於是就找到了新的方案,這一方案下標連續。
於是問題就抽象成在增序序列中,找乙個左端點i和右端點j(就像乙個區間),使得a[j]<=a[i]*p成立,且j-i最大(個數最多)。
如果用二重迴圈來列舉,則在題目要求的時間難以完成,考慮到題目輸入的數列易用sort函式排序成遞增序列,對於有序序列可以採用1、2二分法和3two pointers。
//用二分查詢法;
#include
#include
using
namespace std;
const
int maxn=
100010
;int a[maxn]
;int n,p;
intbinarysearch
(int i,
long
long x)
return l;
//返回l或r都可;
}int
main()
sort
(a,a+n)
;int ans=1;
//至少有乙個數;
for(
int i=
0;i)printf
("%d\n"
,ans)
;return0;
}
#include
#include
using
namespace std;
const
int maxn=
100010
;int n,p,a[maxn]
;int
main()
sort
(a,a+n)
;int ans=1;
for(
int i=
0;i)printf
("%d\n"
,ans)
;//輸出結果;
return0;
}
#include
#include
using
namespace std;
const
int maxn=
100010
;int main (
)sort
(a,a+n)
;//從小到大排序;
int i=
0,j=
0,count=1;
while
(ii++
;//i右移一位
}printf
("%d\n"
,count)
;//輸出結果;
return0;
}
①此題屬於二分法和two pointers型,其難點在於*此結論:能使選出的數個數最大的方案,一定是在該遞增數列中選擇下標連續的若干個數的方案。之後再將此問題轉換為抽象問題:在增序序列中,找乙個左端點i和右端點j(就像乙個區間),使得a[j]<=a[i]p成立,且j-i最大(個數最多)。
②參考**1為手寫二分法,參考**2運用了upper_bound函式減少了**量,參考**3體現了two pointers(雙指標思想)。
PAT B1030 完美數列(25 分)
給定乙個正整數數列,和正整數 p,設這個數列中的最大值是 m,最小值是 m,如果 m mp,則稱這個數列是完美數列。現在給定引數 p 和一些正整數,請你從中選擇盡可能多的數構成乙個完美數列。輸入第一行給出兩個正整數 n 和 p,其中 n 10 5 是輸入的正整數的個數,p 10 9 是給定的引數。第...
PAT B1030 完美數列 (25 分
1030 完美數列 25 分 給定乙個正整數數列,和正整數 p,設這個數列中的最大值是 m,最小值是 m,如果 m mp,則稱這個數列是完美數列。現在給定引數 p 和一些正整數,請你從中選擇盡可能多的數構成乙個完美數列。輸入第一行給出兩個正整數 n 和 p,其中 n 10 5 是輸入的正整數的個數,...
PATB1030 完美數列 25分
給定乙個正整數數列,和正整數 p,設這個數列中的最大值是 m,最小值是 m,如果 m mp,則稱這個數列是完美數列。現在給定引數 p 和一些正整數,請你從中選擇盡可能多的數構成乙個完美數列。輸入第一行給出兩個正整數 n 和 p,其中 n 10 5 是輸入的正整數的個數,p 10 9 是給定的引數。第...