網易遊戲2017互娛實習筆試程式設計(強化裝備)

2021-07-28 11:49:51 字數 3508 閱讀 4869

題目描述

網遊中,裝備強化是提公升角色戰力的常見方法。 現在你參與開發的遊戲中也有這項功能,團隊正在設計每件裝備強化所能提公升的戰力及需要消耗的金幣數。為了設計出乙個合理的強化系統,決定先做一些強化模擬測試,而你現在就在是該模擬程式的開發者。 假設現在有n件可以同時穿戴的裝備,對於第i件裝備,最多可以強化mi 次,對於第i件裝備的第j次強化,會增加fij 的戰力,並需要消耗gij 個金幣。現在給出所有裝備的資料,以及初始擁有的金幣數量,求最多可以增加多少戰力。

輸入描述:

輸入檔案的第一行為乙個正整數t,表示測試資料組數。

接下來有t組資料。每組資料第1行為兩個整數n和s,分別表示裝備數量及初始擁有的金幣數量。接下來是n行,每行表示乙個裝備,其中每行第一項為乙個字串,表示裝備的名稱,第二項為非負整數mi,表示裝備最多可強化的次數,接下來為2*mi個非負整數,表示每次強化會增加的戰力及消耗的金幣數。

資料範圍:

對於所有資料檔案,1<=t<=10。裝備的名稱最大長度不超過32個字元,由大小寫字母或數字組成。每件裝備最多強化次數mi滿足0<=mi<=3。所有戰力數值和金幣數為非負整數且不超過10,000,000。

對於其中的20%資料,滿足裝備數1<=n<=5;

另外有30%資料,滿足裝備數1<=n<=10;

另外有30%資料,滿足裝備數1<=n<=16;

最後剩下的20%資料,滿足裝備數1<=n<=20。

資料保證只有唯一的強化方案能達到最大戰力。

輸出描述:

對於每個測試資料,第一行為乙個整數,表示最多可提公升的戰力。接下來是n行,表示達到這個戰力時每件裝備分別的強化次數,形式為「裝備名稱+強化次數」。輸出裝備的順序要與輸入資料一致。更詳細的格式請參照輸出樣例。

輸入例子:

3 4 100

helm 1 20 30

gloves 1 30 40

boots 1 10 10

sword 1 50 50

5 10

item1 0

item2 1 10000 100

item3 1 10 10

item4 3 1 0 2 1 3 2

item5 3 0 4 1 1 5 1

6 256

1x 2 12 43 35 58

2x 2 34 54 88 31

3x 2 43 10 15 55

4x 2 32 54 19 19

5x 2 84 1 15 45

6x 2 19 40 99 12

輸出例子:

90 helm+0

gloves+1

boots+1

sword+1

12 item1+0

item2+0

item3+0

item4+3

item5+3

418

1x+0

2x+2

3x+1

4x+2

5x+1

6x+2

**(深度搜尋,這個應該可以通過50%case(考試時因為寫錯乙個變數,一直0.00%,修改後的**通過示例),n>=10時可能會超時):

#include

#include

#include

#include

using

namespace

std;

struct equipment;

int maxadd = 0;

std::vector

maxstrennum;

void dfs(const

std::vector

& equipments, int eindex, int qindex, int goldremain, std::vector

& strennum, int totaladds)

return;

}if (equipments[eindex].mi == 0 || qindex >= equipments[eindex].mi)

dfs(equipments, eindex + 1, 0, goldremain, strennum, totaladds);

else

}dfs(equipments, eindex + 1, 0, goldremain, strennum, totaladds);

}}void print(const

std::vector

& equipments)

}int main()

}std::vector

strennum(equipmentnum, 0);

dfs(equipments, 0, 0, gnum, strennum, 0);

print(equipments);

maxadd = 0;

maxstrennum.clear();

}system("pause");

return

0;}

**(dp,其實這個問題是乙個變化了的揹包問題,關鍵在於如何處理成揹包問題並求解):

#include

#include

#include

#include

using

namespace

std;

struct equipment;

int main()

}std::vector

> dp(bindex.size(), std::vector

(gnum + 1, 0));

int maxadds = 0;

for (int k = consumes[0]; k <= gnum; ++k) dp[0][k] = adds[0];

for (int k = 1; k < dp.size(); ++k)

}int count = dp.back().back();

std::vector

result(equipmentnum, 0);

int colindex = dp.front().size() - 1;

for (int k = dp.size() - 1; k >= 0 && count != 0; --k)

}std::cout

<< maxadds << std::endl;

for (int i = 0; i < result.size(); ++i)

}system("pause");

return

0;}

總結:

1.題目的第三個示例存在問題,題目給出的是418,但自己的**跑出來是434,而且驗證了可以達到的最大戰力是434;

2.做題時思路很重要,我就是做題按套路做,沒有明確的思路,導致debug那麼久,一直沒有找到問題,導致最後只a了一道(能不能面試都是個問題了,哭);

3.如果平時刷題沒有當做上機來對待,機試時很容易因為緊張而各種出錯;

4.最後,但願能有面試。

網易互娛遊戲研發工程師筆試

第三題 流量統計問題,二分查詢區間 include include include include using namespace std int main cin m for int i 0 i m i return 0 第四題 三殺,得到殺死每個小乖的時間,然後考慮每種擊殺順序的最小怪傷害 in...

2017網易互娛筆試題 括號匹配

題目描述 對於一行 字串 裡面可能出現大括號 中括號 和小括號 請程式設計判斷改行 的括號巢狀是否正確。printf hello netease 等都是括號使用的正確方法,print hello netease 則是錯誤的範例。輸入描述 輸入包含一行,為一行包含括號的字串 字串長度不超過1000 輸...

網易互娛筆試 電子時鐘

輸入描述 每個輸入資料報含多個測試點。每個測試點後有乙個空行。第一行為測試點的個數t t 100 每個測試點包含1行,為乙個字串 hh mm ss 表示鐘錶顯示的時間。輸出描述 對於每個測試點,輸出一行。如果鐘錶顯示的時間為真實存在的時間,則不做改動輸出該時間,否則輸出乙個新的 hh mm ss 表...