2016網易筆試程式設計題

2021-08-18 18:04:31 字數 1058 閱讀 7574

有 n 個學生站成一排,每個學生有乙個能力值,牛牛想從這 n 個學生中按照順序選取 k 名學生,要求相鄰兩個學生的位置編號的差不超過 d,使得這 k 個學生的能力值的乘積最大,你能返回最大的乘積嗎?

每個輸入包含 1 個測試用例。每個測試資料的第一行包含乙個整數 n (1 <= n <= 50),表示學生的個數,接下來的一行,包含 n 個整數,按順序表示每個學生的能力值 ai(-50 <= ai <= 50)。接下來的一行包含兩個整數,k 和 d (1 <= k <= 10, 1 <= d <= 50)。
輸出一行表示最大的乘積。
示例1

3

7 4 7

2 50

49

題解:這個題一開始想到的是的遞迴搜尋+剪枝,然後發現在遞迴的過程中有很多的值是重複計算的,而且遞迴的複雜度太高,然後轉到dp思路上來。筆者的dp確是很菜,以前做的關於dp的演算法也是比較少的。

言歸正傳,將題目抽象出來就是從n個數中選擇k個數通過某種運算得到極值(無非就是極大值或者極小值),以前做過類似的題目,確實用dp做的。dp[i][j]表示以a[i]結尾選擇j個數後的極值。這樣的就好處理了。題目中有兩個條件:1)有負數存在,2)相鄰的數的index最大是d。

先處理第乙個條件,有負數的話就有可能偶數個負數相乘的來的。那麼假設a[i]是負數的話,要想dp[i][j]最大,那麼dp[k][j-1]應該取最小的才行(當然最好是負數了)。所以就儲存兩個dp陣列,乙個存最大,乙個存最小。狀態轉移方程可以直接看**。

第二個條件就更好處理了,確定了i後,往前推d個數就行了,也就是在i-d~i-1之間的數來轉移方程。

#include#define ll long long

#define inf 1e17

using namespace std;

ll mx[51][51],mi[51][51];

ll a[51];

int main()}}

ll ans = -inf;

for(int i = 1;i<=n;i++)ans = max(ans,mx[i][k]);

cout<

2018網易筆試程式設計題 重排數列

題目 小易有乙個長度為n的正整數數列a 牛博士給小易出了乙個難題 對數列a進行重新排列,使數列a滿足所有的a i a i 1 1 i n 1 都是4的倍數。小易現在需要判斷乙個數列是否可以重排之後滿足牛博士的要求。輸入描述 輸入的第一行為數列的個數t 1 t 10 接下來每兩行描述乙個數列a,第一行...

2019網易秋招筆試 程式設計題 塔

小易有一些立方體,每個立方體的邊長為1,他用這些立方體搭了一些塔。現在小易定義 這些塔的不穩定值為它們之中最高的塔與最低的塔的高度差。小易想讓這些塔盡量穩定,所以他進行了如下操作 每次從某座塔上取下一塊立方體,並把它放到另一座塔上。注意,小易不會把立方體放到它原本的那座塔上,因為他認為這樣毫無意義。...

網易筆試程式設計題

時間限制 1秒 空間限制 262144k 又到了豐收的季節,恰逢小易去牛牛的果園裡遊玩。牛牛常說他對整個果園的每個地方都瞭如指掌,小易不太相信,所以他想考考牛牛。在果園裡有n堆蘋果,每堆蘋果的數量為ai,小易希望知道從左往右數第x個蘋果是屬於哪一堆的。牛牛覺得這個問題太簡單,所以希望你來替他回答。輸...