hdu5242 上海邀請賽 優先佇列 貪心

2021-09-08 17:51:48 字數 2410 閱讀 7954

題意是給你一棵樹    n個點 n-1條邊   起點是1   每乙個點都有權值 每次能從根節點走到葉子節點   經行k次遊戲 每次都是從1開始    拿過的點的權值不能拿第二次   問最大權值和。

說說我的做法吧    map【i】=a表示i節點的跟節點為a節點   從全部葉子節點開始入隊(有點佇列裡有三個變數  各自是節點編號  權值  深度  優先順序看**    裡面有點貪心的意思) 每次走根節點   假設根節點沒走過  則走它   並把該店權值變為0    否則直接跳到1這個節點(假設乙個個跳可能會超時)再入隊    當出隊的編號為1時而且拿的個數小於遊戲次數 則拿  否則結束  在跑深度的時候有個優化     開始沒有超時了            假設該節點深度已知了  則以後的根節點就不用跑了。!

詳細看**吧

#include#include#include#includeusing namespacestd;

intmap[100010],mark[100010];

intdeep[100010];

__int64num[100010];

structnode

}a;

intmain

()memset(mark,0,

sizeof

(mark));

for(i=1;i<n;i++)

priority_queue<node>q;memset(deep,0,

sizeof

(deep));

for(i=1;i<=n;i++)

x=map[x];d++;

}x=i;

while

(x!=1)

a.deep=deep[i];a.value=num[i];a.ii=i;q.push(a);

}}//for(i=1;i<=n;i++)

//printf("%d ^^^ %d\n",i,deep[i]);

__int64sum=0;

intcont=0;

while

(!q.empty())

*/if

(a.ii==1)

else

else

q.push(a);

}}printf("case #%d: %i64d\n",r++,sum);

}return0;

}

HDU 5242 GAME 2015上海邀請賽G題

題意 給定一顆以1號節點為根節點的有向樹,每個節點有乙個權值,問從1號節點出發k次,能到達的所有節點的和的最大值。思路 貪心的把樹的鏈按照權值和從大到小剖分成若干條鏈 過程可以根據上交書上的熟練剖分模版做細小改動 然後根據每條鏈的權值排序取最大的k個就是答案。include include incl...

2014上海邀請賽解題報告

難得能把整套題目做完,留個痕跡小小激動一下 這套題難度不大,雖然有些題目的題意描述得有點晦澀 先這裡簡單列舉一下吧,詳細的解題報告後面的鏈結。a.game with pearls 解題報告 貌似各種技巧能過,不過我想都沒想,粗暴地丟了個二分匹配上去。b.beam cannon 解題報告 線段樹 按照...

B Beam Cannon 2014上海邀請賽

題意 給 n 個點和乙個長 w 寬 h 的矩形,問平移這個矩形最多能覆蓋多少個點 思路 對於每乙個點,考慮什麼樣的矩形能覆蓋它,考慮矩形的中心點就可以,這樣乙個點對應乙個矩形,然後就是求 n 個矩形覆蓋次數最多的區域 用線段樹區間查最大就可以 include define mid l r 1 def...