適合初步練習PAT乙級 (1030) 完美數列

2021-10-02 20:31:28 字數 1190 閱讀 2330

給定乙個正整數數列,和正整數 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

#include

#include

#include

using

namespace std;

intmain()

else}}

cout << result;

return0;

}

思路:首先將數列從小到大排序,設當前結果為result為當前的最長長度,temp為臨時變數,計算每個[i]的最長完美數列長度temp,若大於result則更新result,最後輸出result的值。

v[i]*p可能超過範圍,則會將乘積轉成為long long,另外,第二次提交時,出現執行超時,這是因為我定義int j=0,其實下乙個i的最長長度要比上乙個的temp長,否則沒有意義。

方法2:令兩個下標i,j的初值均為0,表示i,j均指向有序序列的第乙個元素,並設定計數器count存放滿足a[j]<=a[i]*p的最大長度。接下來讓j不斷增加,直到不等式a[j]<=a[i]*p恰好不成立為止(在此過程中更新count).之後讓下標i右移以為,並繼續上面讓j不斷增加的操作,以此類推,直到j到達序列末端。這個操作的目的在於,在a[j]<=a[i]*p的條件下始終控制i和j的距離最大。

#include

#include

using namespace std;

const

int maxn =

100010

;int

main()

i++;//i右移一位

}printf

("%d\n"

, count)

;//輸出結果

return0;

}

適合初步練習PAT乙級 (1019) 數字黑洞

給定任乙個各位數字不完全相同的 4 位正整數,如果我們先把 4 個數字按非遞增排序,再按非遞減排序,然後用第 1 個數字減第 2 個數字,將得到乙個新的數字。一直重複這樣做,我們很快會停在有 數字黑洞 之稱的 6174,這個神奇的數字也叫 kaprekar 常數。例如,我們從6767開始,將得到 7...

適合初步練習PAT乙級 (1064) 朋友數

如果兩個整數各位數字的和是一樣的,則被稱為是 朋友數 而那個公共的和就是它們的 朋友證號 例如 123 和 51 就是朋友數,因為 1 2 3 5 1 6,而 6 就是它們的朋友證號。給定一些整數,要求你統計一下它們中有多少個不同的朋友證號。輸入格式 輸入第一行給出正整數 n。隨後一行給出 n 個正...

適合初步練習PAT乙級 (1067) 試密碼

當你試圖登入某個系統卻忘了密碼時,系統一般只會允許你嘗試有限多次,當超出允許次數時,賬號就會被鎖死。本題就請你實現這個小功能。輸入格式 輸入在第一行給出乙個密碼 長度不超過 20 的 不包含空格 tab 回車的非空字串 和乙個正整數 n 10 分別是正確的密碼和系統允許嘗試的次數。隨後每行給出乙個以...