六月份解题日志

考试月……做题比较少……


June_2
http://acm.pku.edu.cn/JudgeOnline/problem?id=3026

Borg Maze最小生成树。这个题目本来是简单题,结果由于疏忽,写了两个多小时…… 犯了一个弱智错误:数组开小了,不过由于G++不报错,得到诡异的错误……

让我想起寒假时候HDU给我不报RE报TLE的事情了。









June_5
POJ1011/WOJ1212 Sticks

经典搜索题。
这个题目做了很久——去年暑假个人赛模拟赛第一次接触,当时没做出来,不过后来模

仿别人程序把POJ1011过了,不过WOJ1212却是TLE。

最近几天看了下《算法艺术与程序设计竞赛》上的减枝方法,总算弄清楚了,今天早上写了一下……

大体框架为DFS,最重要的是减枝。
下面是我的一些减枝:
1、要得到的Sticks长度必定为总长度的约数——这个好想;
2、对blocks按长度由小到大排序(原来也排了,当时不知道为什么要排——为了减枝);
3、搜索顺序为:
用blocks去组成sticks,
减枝一:按照组成sticks的最长block排序(由大到小),这个可以证明的,而且剩下的blocks中最长block一定要选择;
减枝二:组成每根sticks时按从大到小枚举,如果可行则当前方案一定是最后方案(理解这个我用了比较久,其实就是如果有另外的另两根短的blocks可替换的方案存在,那么长blocks放在后面也是对的,如果固定在前面,可减少不少);
减枝三:对于长度相同的blocks,如果当前用其中一根组成当前sticks不能得到结果,那么当前的选择要跳过所有的这些blocks(这个从搜索树上理解就好了——画出一棵搜索树,会发现这些blocks为根的子树完全相同);

这样就可以过了,WOJ1212 15+s, POJ1011 0MS.

trick:由于woj1212只卡时间,我用了一个错误的减枝(很弱智,也就不说了)得到了5MS的程序(当然在POJ1011上WA了)。建议做这题要把两个地方的题目都AC了。

要好好地理解这个题目的方法——我学到的最重要的是从状态搜索树的特点上剪枝。







June_5
HUST1019 A dangerous trip

http://acm.hust.edu.cn/thx/problem.php?id=1019

这个基本代表了一类题目了——与校赛的Path(WOJ1352)的最短奇偶路径相似。

方法很简单:
对每个点保存两个值,做两遍最短路:
第一次普通最长路,
第二遍做最短路时,对所有边枚举其缩到一半的情况,具体就是:
Dist[p->v][1] = min(Dist[i][0]+p->len/2.0, Dist[i][1]+p->len)

别的没什么好说的,这个题目是简单题。








June_9

Cashier Employment http://acm.pku.edu.cn/JudgeOnline/problem?id=1275 差分约束问题。 这种题目难的地方就是建图,这个题目特殊的地方是得到最后的不等式中第23小时不好处理,那么就枚举啦(数据范围不大,二分也是可以的)。 不过有个地方还没懂——我建图后枚举用bellman—ford后如果满足约束就返回true错了,改为冯威的论文上的!=4的约束条件就AC了——有什么trick? 总结一下差分约束问题:先对题目建立模型,然后抽出不等式,再整理成差分约束标准形,最后bellman-ford检查约束条件。 差分约束简单类题目就这么搞了,难的变化大,目前搞不定,需要多见识积累经验……










June_29
Reset Sequence POJ Monthly June 2008http://acm.pku.edu.cn/JudgeOnline/problem?id=3609 题目意思是有n种状态和m种命令(2<=n<=8, 1<=m<=16),然后给出一个n*m的矩阵,表示在状态i下面接受到命令j则改变到状态a[i][j]。目标是求一最短序列满足:在任何初始状态下,通过执行这一命令序列后都到达状态0。 今天状态不好(毕竟近20天没写题了),看到这个题目后没有想法,oldmaner也认为只能穷举,然后我写了上去居然WA了(没有TLE),就在考虑是否漏了情况,未果。 后来改模型,居然推出一个状态DP的模型,还好很快由此想到了图论——这个题目是个简单题。 解法:由于n很小,所以可以对在执行了一系列命令后的状态用一个顶点表示(就是一个2进制数标号,对应位为1表示当前的状态——开始时处于1111状态,最后处于0111状态)。 后面就很简单的建图:如果从某一状态u可以通过命令j转换到状态v,则在u和v间连一条边(“权”为1,标志为j)。 最后就是跑一个最短路。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值