HDU 1114 Piggy-Bank

这个基本上还是01背包嘛,但是这回我把状态的判定条件设置为在一定重量的情况下,尽量让硬币的总价值更少。

HDU 2191 悼念512汶川大地震遇难同胞――珍惜现在,感恩生活

这个是一个多重背包问题,其实多重背包就是01背包,举个例子(其实是扒的):

¤像如果某件物品的重量为1,价值为2,数量为1000

¤我们就可以拆分成:

¤重量为1,价值为2的物品 重量为2,价值为4的物品

¤重量为4,价值为8的物品 …

¤重量为256,价值为512的物品

¤重量为489,价值为489*2的物品

简要地说,就是先拿二进制拆,拆出来1,2,4,8,16,32。。。这样的,等到拆不动了(剩下的不够下一个2进制整幂了),就把剩下的单独拿出来当成一个新物品,这样就不会丢解了。拆分完之后不就变成01背包了嘛。

HDU 2546 饭卡

这道题给我玩惨了,原因就是“hehe”那里没有加,后果是啥大家都知道。。。

其实是一个包装过了的01背包问题,既然>=5块时都能随便花,那么我就把最贵的那个留下,然后尽量把饭卡刷到还剩5块钱的程度(不一定是五块,但尽量靠近五块),然后再去买那个最贵的,一次性刷爆。(虽然还是有可能刷不爆的,但余额尽量小是真的),“尽量把饭卡刷到还剩5块钱的程度”,这个就可以转化为重量限定m-5,每个物品重量与价值相等情况下的01背包问题。

就这样。

HDU 1874 畅通工程续

这是个裸的最短路问题,随便怎么搞都行。

这里用的是没有堆优化的dijkstra。

HDU 3023 Dirt

经过了极其艰辛(~3天)的过程终于把这个题肝出来了。

基本题型是最短路,采用dijkstra,利用优先队列做堆优化,之所以老不过是因为松弛写错了,当时错误地认为下一节点一定会换鞋,实际上应该判断一下是不是要换鞋,换鞋和不换鞋的松弛操作要分开进行。

HDU 1557 权利指数

这个题二进制枚举,但是姿势要正确,如果是先枚举每个人,然后根据这个人找到所有符合要求的情况,一个人一个人地出解,这样就太慢了。

好的姿势是直接枚举所有情况,对于每种情况,分别枚举把其中的一个人干掉之后是不是会小于总票数一半,符合要求的话就给那个人的计数器+1,最后输出结果,这个姿势就快多了。

HDU 5012 Dice

不科学的剪枝,当深度到5就放弃当前节点,然后居然过了,可见数据水了。

科学的做法是把骰子的6个面的状态连一起当成整数,开个标记数组,就跟hash一样。

HDU 2553 N皇后问题

C++作业不好好写的后果。。。

注意必须要用DFS来搜索,逐行搜。

 

HDU 1015 Safecracker

用STL,next_permutation把所有可能性搞出来注意检验就可以爆过去了。

HDU 1166 敌兵布阵

题意

求区间和,单点修改。

思路

典型的线段树问题,线段树的实现原理这里不再赘述。

代码

这份代码使用了zkw的非递归堆存储自底向上式线段树,实现难度较低。

 

Scroll to top