HDU 2546 饭卡

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

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

就这样。

POJ 3624 Charm Bracelet 顺便讲一下01背包

裸的01背包问题,是DP的基础题型了,没有太多好说的。

简要说一下01背包问题的状态转移特点:按两个基准纪录数据,第一个基准是我们从0~a号物品中选,第二个基准是选择的物品已经有了多少重量b,这样组成了dp数组dp[a][b],这个数组存储的是当前状态的价值是多少。接下来我们开始dp,对于每一个当前状态(最多选择到第n个物品,已经占用了w重量),我们是从两种先前状态中导出的:1.最多选择到n-1个物品(就是当前物品还没有考虑呢),占用重量w-x(x是第n个物品重量),在这个状态上,我们添加上第n个物品。2.最多选择到n-1个物品,占用重量w,在这个状态上,我们什么也不做,直接把他当成当前状态。

在这两种先前状态中选择最好的那个(有时候因为某些原因,只能选择一个,那就选唯一的那个就好),保存下来决定为当前状态,再供以后使用。

这样我们只要读取dp[i][j]的值,就是“选择1~i中的物品,重量限定为j,最高价值是?”这个问题的答案。(没有用滚动数组的话)

HDU 1874 畅通工程续

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

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

POJ 1062 昂贵的聘礼

这个题是一个比较基准有些多的最短路(和之前那个Dirt挺像)。

(这里的cost就是dijkstra算法里面的dis值)每一次更新下一节点时,下一节点的cost值为(当前cost值-当前点权+下一边边权+下一点点权);每一次到达节点后,都根据当前抽出的节点的地位值,更新当前走过节点的地位的最大最小值,等接下来更新临接节点时,如果下一节点的地位与当前最大最小值中任意一个只差绝对值>m就要抛弃。以这两个为基准,进行正常的dijkstra,然后从头到尾的扫一遍cost数组,把最小值输出来就是答案。

POJ 1135 Domino Effect

题我就没读懂。。。

其实是这样,把每一个key domino当做节点,他们之间的骨牌数目当作边权,用dijkstra处理一下得到的就是骨牌倒道该节点的最短时间,接下来我们要考虑在中间倒完的情况。

如果在两个节点中间倒完的话,也就意味着从起点经过两个key domino到终点,左右两边走过的时间是一样的,所以我们可以用(dis[a]+dis[b]+edge.cost)/2这个就可以求出在两点之间倒完需要多少时间,我们把每条边都这样过一遍,如果求出来的这个值比左右两边节点的dis都大,说明倒在中间,如果正好等于某一个节点的dis值,就把那个节点当作终点,把所有的边都这样过完之后,找到最大的(dis[a]+dis[b]+edge.cost)/2对应的终止情形,就是答案。

如何给priority_queue写比较函数

下面是转的:

注:

  1. less<class T>这是大顶堆,按值大的优先,值大的在最上面。greater<class T>这是小顶堆,按值小的优先,值小的在最上面。
  2. 自定义cmp如果还有不明白的看这里:
  3. 还是自定义cmp函数,注意,一般ACM中用结构体内含“bool operator()(const int &a,const int &b)”。这其实等价于Class cmp,不过更省事,当然也不规范(不需要规范)。
  4. return就是希望如何排列为true。如果希望由大到小,就将大到小的情况return;反则亦然。和sort的自定义cmp是一样的。

HDU 3023 Dirt

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

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

HDU 1557 权利指数

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

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

CodeForces 244B Undoubtedly Lucky Numbers

把那些lucky numbers预先生成出来打进一个表里(预处理),接收到输入的时候然后只要查表就可以了。

HDU 5012 Dice

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

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

Scroll to top