題目描述
網遊中,裝備強化是提公升角色戰力的常見方法。 現在你參與開發的遊戲中也有這項功能,團隊正在設計每件裝備強化所能提公升的戰力及需要消耗的金幣數。為了設計出乙個合理的強化系統,決定先做一些強化模擬測試,而你現在就在是該模擬程式的開發者。 假設現在有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 表...