地址:https_community_topcoder_com/stat?c=problem_statement&pm=2288&rd=4725
大意:一开始只有一把武器(攻击力为1),有n个boss,int类型的血量bossHealth,持有武器string类型的damage(例如“2867”,表示对第0个boss的攻击力为2,对第1个boss攻击力为8,以此类推),打败boss可以获得其武器。问最少打击几次才能把所有boss打败(最多15个boss)?【打击:比如bossHealth=15,攻击力=4,则需要打击4次】
算法:最短路+优先队列+位运算。
构图:每个节点代表一种持有武器的状态,节点之间的边表示状态的转移(获得武器),边的权值为获得该武器的代价(也就是,用在当前节点持有的武器,去打败boss后获得武器的最少打击次数【需要遍历当前武器,找到针对该boss最大的攻击力】)。
细节:
1)node { int weapon; int shots; } 其中weapon作为位状态,第i位为1表示持有该武器;shots为到达该节点的状态。
2)起始点 0,0;目标节点 全1,最后输出的代价(最小打击次数)
3)优先队列 priorityQueue top pop add
4)dijkstra:while(pq not empty) {
pop min cost node;
check dest;
for all neighbor node, do { update node if not in queue add }
// 这道题为DAG,所以所有节点不会有更新,只需要加入
}