又一次當槍手的經歷,但是,說實話好久沒敲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 個棋子所需要的最少操作次數.輸入描述 輸入包括三行,...