PAT B1030 完美數列 25

2021-10-20 18:30:30 字數 2255 閱讀 4586

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 是給定的引數。第...