PAT B1030 完美數列

2021-10-05 01:22:11 字數 1003 閱讀 7664

從n個正整數中選擇若干個數,使得選出的這些數中的最大值不超過最小值的p倍。問滿足條件的選擇方案中,選出的數的最大個數。

1082

32045

1678

9

8
331

23//output 3

由於題幹中涉及序列的最大值和最小值,因此不妨先將所有n個正整數從小到大進行排序。在此基礎上證明:能使選出的數個數最大的方案,一定是在該遞增序列中選擇連續的若干個數的方案。

p與序列中的元素均可能達到10**9,因此a[i] *p可能達到10的18次方, 所以必須使用long long型別

如果強制進行o(n**2)的二重迴圈列舉,那麼根據題目的資料範圍,肯定是會超時的。以下用兩種方法來解決這個問題:二分查詢和two pointers。

二分法裡用了upper_bound(),該函式底層是使用二分法實現的,具體到本題會在a[i+1]~a[n-1]中查詢第乙個超過a[i]*p的數,返回其位置指標。也可以自己寫個二分查詢函式。

根據實際測試,兩者的時間複雜度基本為線性,相比之下,two pointers略快一點

#include

using

namespace std;

int a[

100010];

intmain()

printf

("%d"

,count)

;return0;

}

#include

using

namespace std;

int a[

100010];

intmain()

count=

max(count,j-i);}

printf

("%d"

,count)

;return0;

}

PAT B 1030 完美數列

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

PATB1030 完美數列

正解肯定是二分,懶癌的lz用multiset,最後不能直接相減得到兩個迭代器的距離 紅黑樹啊摔 沒有辦法只能用distance 只是想試試會不會超時,哈哈哈,真的超時了,還是滾回去乖乖二分啊。int n,p multisetnum int main int argc,const char argv ...

PAT B1030 完美數列

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