記得wikioi開站不久的時候,我做這題被嚇住了。後來發現沒什麼難度。
首先dfs序記錄結點資訊。
left為左孩子 right為右孩子
time表示走廊的時間 cost表示價值(如果為0 表示為分岔口)
int dfs()
這題要詳細說一下。
如果記錄到leaf結點
那麼記錄下編號old_leaf
leaf++
表示讀入就要讀入下乙個節點
那麼左孩子=dfs()
右孩子=dfs()
(dfs是有返回值的,表示節點的編號,在遞迴當中就可以記錄孩子節點。這是一種處理技巧,知道就好。)
如果f[r][s]表示r節點在剩餘s秒時的最大價值。
那麼通過這個通道需要tree[r][s].time的時間
因為不僅要進去,還有出來。那麼就剩餘s-tree[r].time*2
列舉i表示左子樹遍歷i秒,則右子樹剩餘s-tree[r].time*2-i
那麼f[r][s]=max;
如果r為葉子節點
那麼如果剩下的畫在有限的時間內拿完,就會剛剛好拿到tree[r].cost個
如果偷不完,說明剩下s-tree[r].time2的時間,那麼就可以拿int(s-tree[r].time*2)5個int()表示下取整
因為如果進去可能被警察抓到,所以有可能不進入這個分叉點。
所以可以簡寫為
max(0,min((s-tree[r].time*2)/5,tree[r].cost))
#include#include#includeusing namespace std;
const int max_n = 601;
const int root = 1;
struct node
tree[max_n];
int f[max_n][max_n];
int s;
int leaf = 0;
int input()
int init()
int work(int r,int s)
int put()
int main()
Wikioi P1135 選擇客棧
noip2011 day1 第二題 題目描述 description 輸入描述 input description 共n 1 行。第一行三個整數 n,k,p,每兩個整數之間用乙個空格隔開,分別表示客棧的個數,色調的數目和能接受的最低消費的最高值 接下來的 n 行,第i 1 行兩個整數,之間用乙個空格...
Wikioi P1137 計算係數
題目描述 description 給定乙個多項式 ax by k,請求出多項式展開後x n y m項的係數。輸入描述 input description 共一行,包含 5 個整數,分別為a,b,k,n,m,每兩個整數之間用乙個空格隔開。輸出描述 output description 輸出共 1 行,...
題目1163 素數
題目描述 輸入乙個整數n 2 n 10000 要求輸出所有從1到這個整數之間 不包括1和這個整數 個位為1的素數,如果沒有則輸出 1。輸入 輸入有多組資料。每組一行,輸入n。輸出 輸出所有從1到這個整數之間 不包括1和這個整數 個位為1的素數 素數之間用空格隔開,最後乙個素數後面沒有空格 如果沒有則...