1030 完美數列 25 (25 分)

2021-08-20 17:56:54 字數 1768 閱讀 7019

現在給定引數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

完美數列 也就是 滿足方程的最大覆蓋資料中的資料個數。

思路 :

1. 先使得資料按照從小到大有序排序。

2.此時資料有序,這個時候遍歷從 n-1號元素開始到 1 號元素結束,外部變數cnt記錄覆蓋的情況,如果此時的覆蓋比上一次覆蓋的個數要多就更新cnt否則就不更新。

3.傳入 n-1號元素給子函式 計算最小滿足方程的元素。子函式採用二分查詢修改後的方法。定位最小範圍 實現方法:

<< 找到範圍中間的數判斷是不是滿足不等式,滿足 移動 max的指標到這個元素,再動用二分修改查詢,不滿足,移動min指標到這個元素 再用二分修改查詢 直到 二分值等於min所指元素的下標的時候 就break; 為什麼?假設 min指標指向 1 號元素 max指標指向2號元素  (1+2)/2 是不是等於 1 如果這種情況不處理程式就會進入死迴圈。所以 一旦(類似) (1+2)/2 == min 那麼就跳出。判斷 min所指向元素是否滿足方程 滿足則返回 min元素的位址  否則由於前期的調整(紅色處) 此時 max 所指向元素一定滿足條件,返回max元素所指向元素的指標。>>(|||== 也就是說我盡量把 max指標指向可控範圍,解答函式裡做了乙個判斷 如果max都沒有移動過 那麼此次迴圈作廢 一定不更新cnt)

好了 上**吧 剛開始挺困擾我的 因為 一般思路是  排序   然後從這個元素 每一次都逐一往前遍歷 找到範圍,這樣時間複雜度會比較高,此題還有部分不嚴謹的地方。在上完**後會說一下:

#include using namespace std;

long long int a[100000 + 10];

int n, p;

long long int* efcz(int x)

else if (a[st] * p >= a[x])

else

} if(a[minst]*p>=a[x]) // 保險 3

return &a[minst];

return &a[maxst];

}void solve()

} printf("%d\n", cnt);

}int main()

我認為題目的樣例沒有考慮到的:

1.這個情況題目也沒有處理。就是一串數字所組成的所有數列之中 全部都不滿足條件的情況 這個時候 二分的指標將會指向 數列最大值的前一項 這個時候 假定這個數也不滿足條件 那麼 如果沒有3 就會出現 cnt由1變成2的錯誤情況

題目沒有考慮到的樣例1  這個是顯然的錯誤。雖然我學c 才不到三個月 ~ 這種問題應該是顯而易見才對。

5 21 11 111 1111 11111

應該輸出 1  去掉 if輸出 2  但是去掉if 答案依然是正確的。所以我懷疑題目樣例出的不全。但是網上的答案這個樣例我試的均輸出正確了(hahahaha~~~)。但是這個和樣例問題沒有半毛錢關係~

必須要艱苦奮鬥,才能看見陽光。現在雖然辛苦,但是必須承認也在成長。起步晚怎麼了?每次被嘲笑,我已經要受夠了!!

1030 完美數列 25 (25 分)

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

1030 完美數列(25 分)

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

1030 完美數列(25 分)

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