給定乙個正整數數列,和正整數 p,設這個數列中的最大值是 m,最小值是 m,如果 m≤mp,則稱這個數列是完美數列。
現在給定引數 p 和一些正整數,請你從中選擇盡可能多的數構成乙個完美數列。
輸入格式:
輸入第一行給出兩個正整數 n 和 p,其中 n(≤105)是輸入的正整數的個數p(≤109)是給定的引數。第二行給出 n 個正整數,每個數不超過 109。
輸出格式:
在一行中輸出最多可以選擇多少個數可以用它們組成乙個完美數列。
輸入樣例:
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 分別是正確的密碼和系統允許嘗試的次數。隨後每行給出乙個以...