2012年10月5日
摘要: RQNOJ_62 我们可以将牌在相邻堆之间的移动想象成经过了一条边,那么任意两堆相邻的牌之间都会有一条边,而且在最优情况下每条边应当是至多经过一次的,如果超过一次的话也可以通过相消变成至多经过一次。那么如何确定一条边要不要被走呢?实际上对于任意一条边来讲,都将牌划分成了左右两部分,如果两部分各自内部不能平衡的话就会通过这条边来达到平衡的目的。这样扫一遍前缀和就可以判定有多少条边需要经过了,而经过的边的数量就是最后的结果。至于可行性,由于最后需要经过的边都是有向的,所以会形成一个有向图,按有向图的方向移动牌即可。#include<stdio.h>#include<string. 阅读全文
posted @ 2012-10-05 17:45 Staginner 阅读(204) 评论(0) 推荐(0)
摘要: BZOJ_2582 首先来说,如果一个连通块里面的边的数量EN如果大于点的数量VN的话,那么显然是没办法保证每条边都属于一个顶点的,于是接下来就只剩两种情况要讨论了,一种是EN==VN,一种是EN==VN-1。 如果EN==VN,说明这个连通块里存在一个环,而环上的点是必须要选环上的边的,否则环上的边就会剩下,这样不妨把环拿下来,这时就会发现剩下的部分的分配方案是唯一的,而环这部分的分配方案是有且只有2种的。 如果EN==VN-1,可能着眼于哪个点拥有哪条边不是那么好计算,但换个思路就会非常清晰了,由于VN<EN,那么最后会有一个孤立点,我们不妨考虑这个孤立点是哪个点,而一旦确定某个点是 阅读全文
posted @ 2012-10-05 17:09 Staginner 阅读(385) 评论(0) 推荐(1)
摘要: BZOJ_2021 首先一个贪心的思路就是,如果需要大奶酪,那么一定把大的放在上面,而且是把高度最小的大奶酪放在最上面。因此我们可以现将奶酪排个序,把小奶酪放下面,大奶酪放上面,而且大奶酪较矮的放在最上面。 接着考虑放奶酪的决策,如果不用大奶酪的话自然就是一个裸的背包问题,如果用大奶酪就会涉及到一个问题,就是最上面的奶酪是原高,其余的都是原高的4/5,这时可以多加一个bit表示现在奶酪是不是已经“封顶”了,在“封顶”之前高度都按4/5算,“封顶”时按原高算即可。#include<stdio.h>#include<string.h>#include<algorith 阅读全文
posted @ 2012-10-05 16:44 Staginner 阅读(321) 评论(0) 推荐(0)