優先佇列 百度2018校招程式設計題 序列合併

2021-08-08 19:48:13 字數 2125 閱讀 6158

又一次當槍手的經歷,但是,說實話好久沒敲c++了有些手生,乙個是freopen傳參是啥來著想半天沒想起來,乙個是居然忘記優先佇列的pop是不return的了……

哦對了這題我也放在新搭建的主頁上了,也可以去那兒看看~ 傳送門

此題為:

機器學習/資料探勘/自然語言處理方向

程式設計題 第2題

定義函式 f(

n)=a

7n7+

a6n6

+a5n

5+a4

n4+a

3n3+

a2n2

+a1n

+a0

其中係數 ai

都是整數,滿足 0≤

ai≤1000

且至少有兩個係數嚴格大於0,分別將 n=

1,n=

2,n=

3,..

. 代入以上函式可以得到無窮長度的證書序列,即用8個係數 a7

,a6,

...a

0 可以唯一確定乙個無窮長度的整數序列。現在給出k個通過以上方法定義的無窮序列,你需要求出將這些所有數字放在一起後,第n小的數字是多少。

首先理解題意,有k個數列,找出其中第n小。

那麼每次定位從哪個數列要數字,是本題的時間限,那……就用最小堆就行了,找個在c++的stl裡等價的,那就用優先佇列吧。

於是我們先把每個

f 函式的引數讀進來,用乙個a[a_idx]來存這8個數字,並且把n等於1時的狀態放進優先佇列裡,這樣我們讀完就有了乙個最小堆,堆頂是所有數列中最小的乙個:

for(int j=0; j<8; j++)

scanf("%lld", &a[i][j]);

q.push(t(calc(a[i], 1), 1, i));

我們得到了數,但是還需要知道這個數是從哪個佇列來的,以及這是當前數列的第幾個數了,所以我們用乙個結構體來記錄這些事情:

class t

};

於是,題目就演變成了:每次取數列中最小的那個,並且計算這個數列(第a_idx組引數對應的函式)下乙個(n+=1)是什麼數字(value),把他們包裝好,再放進優先佇列裡(此處需要注意優先佇列預設是大頂堆,需要小頂堆時需要如下定義)

priority_queuevector

, greater> q;

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

typedef

long

long ll;

class t

};bool

operator > (const t &t1, const t &t2)

ll calc(ll* a, int n)

int main()

; priority_queuevector

, greater> q;

while(!q.empty()) q.pop();

int n; scanf("%d", &n);

for(int i=0; ifor(int j=0; j<8; j++)

scanf("%lld", &a[i][j]);

q.push(t(calc(a[i], 1), 1, i));

//cout<}

int k; scanf("%d", &k);

ll ret = 0ll;

for(int i=0; iint _n = cur.n;

int _i = cur.a_idx;

ret = cur.value;

t inp = t( calc(a[_i], _n+1), _n+1, _i );

q.push(inp);

}cout

/*sample input:

30 0 0 0 1 2 0 0

0 0 0 0 0 0 10 6

0 0 0 0 0 0 25 1

9sample output:

51*/

百度春季校招第2題

乙個數軸上共有n個點,第乙個點的座標是度度熊現在位置,第n 1個點是度度熊的家。現在他需要依次的從0號座標走到n 1號座標。但是除了0號座標和n 1號座標,他可以在其餘的n 2個座標中選出乙個點,並直接將這個點忽略掉,問度度熊回家至少走多少距離?輸入描述 輸入乙個正整數n,n 50。接下來n個整數表...

2018 年百度校招 最大子串行

對於字串x和y,如果擦除x中的某些字母 有可能全擦掉或者都不擦 能夠得到y,我們就稱y是x的子串行。例如.ncd 是 nowcoder 的子串行,而 xt 不是。現在對於給定的乙個字串s,請計算出字典序最大的s的子串行。輸入包括一行,乙個字串s,字串s長度length 1 length 50 s中每...

網易校招2018程式設計題

小易將n個棋子擺放在一張無限大的棋盤上。第i個棋子放在第x i 行y i 列。同乙個格仔允許放置多個棋子。每一次操作小易可以把乙個棋子拿起並將其移動到原格仔的上 下 左 右的任意乙個格仔中。小易想知道要讓棋盤上出現有乙個格仔中至少有i 1 i n 個棋子所需要的最少操作次數.輸入描述 輸入包括三行,...