1020 SHOI2008 安全的航线flight
这题的代码写了很久,主要是因为几何题的东西都忘得差不多了。除去写代码的2个小时,今晚又调了一晚上,终于AC了。
这题的做法还是很有参考价值的。
最简单的方法:
二分一个答案(ans),把小岛向外变大(ans)的距离。这个“变大”可以把点变成圆,把线段变成矩形。然后判断线段(航线)是否被完全覆盖,此做法巨烦。
除了上面所说的做法外,还百度到了一篇ydc的题解:http://ydcydcy1.blog.163.com/blog/static/21608904020131492229367/ 《迭代思想的应用》(莫涛)这篇论文硬是没找着。
1021 SHOI2008 Debt 循环的债务
一道动态规划。注意到钱的总数比较小,所以设(f(i,a,b))为使用前i中钞票,使得Alice有(a)元,Bob有(b)元,Cynthia有(sum-a-b)元((sum)是钱的总数)的最小交换次数。
注意到,如果Alice给了Bob(X)元,Bob又给了Cynthia(X)元那么干脆让Alice给Cynthia(X)元,因为题目要求交换次数最小。所以转移的时候只有(6)种可能(用ABC代替他们的名字):
1.A->B,A->C
2.B->A,B->C
3.C->A,C->B
4.B->A,C->A
5.A->B,C->B
6.A->C,B->C
时间复杂度(O(6 cdot 1000^2 cdot x^2)),x是转移时的钞票数量,理论上是过不了的,但。。。。
1022 SHOI2008 小约翰的游戏John
传说中的anti-nim。判断方法:
根据《组合游戏略述——浅谈SG游戏的若干拓展及变形》(贾志豪)的说法:
设条件一为SG的值为零;
条件二为某单一游戏的SG大于一。
那么,当且仅当 其中一个条件满足 而 另外一个不满足,那么就是必胜态。
证明也很容易,利用数学归纳法即可。
1024 SCOI2009 生日快乐
暴搜即可。
1025 SCOI2009 游戏
题目易转化为:将(n)进行整数拆分,问:拆分成的若干整数的lcm有多少种可能?
QAQ
如果有两种拆分方案的lcm相等,我们只取1个数最多的方案。比如:
19 = 2 + 9 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 方案一
19 = 18 + 1 方案二
两者lcm都是18。
我们统计方案一的。
这样的话,如果lcm的结果为$ {p_1}^{q_1} {p_2}^{q_2} {p_3}^{q_3} ...(,那么我们统计的拆分方案一定为: ) n = {p_1}^{q_1} + {p_2}^{q_2} + {p_3}^{q_3} + 1 + 1 + ...$(也可能没有+(1),反正+(1)是为了刚好凑成(n))。
这样就可以dp了,dp过程不再累赘叙述!
1026 SCOI2009 windy数
DP,记(f(i,upper,isZero,lastNum)),分别表示第几位、有没有上界、是否为(0)、上一个填的数字。
1027 JSOI2007 合金
样例居然是错的,囧。
QAQ
高一的数学数学看起来学得不好啊QAQ。
不妨把合金表示为向量((x,y,z)),(x,y,z)就是读入的那个合金比例。
如果是两个材料合起来,能够合成怎样的合金呢?
设两种材料分别为(vec a)和(vec b),成品为(vec c),使用第一种材料的比例是(p(0leq q leq 1)),那么有$$vec c = pvec a + (1-p)vec b$$
这说明(vec c)和(vec a - vec b)是共线的,并且点!由于无论怎样合成,(x+y+z=1),所以可以去掉一维,变成平面上的点。
如果是三种(或以上)的材料,可以合成的成品就是一个面(凸包)!
问题就变为:有一些白点和一些黑点,需要选出最少的白点,使得所有的黑点都在白点的凸包里。
这个问题居然可以转化成图论:
枚举两两白点(设为点(A)和点(B))形成的向量,如果其他所有的黑点都在向量的“左边”,那么就连一条有向边(A)->(B),如果都在右边,连一条有向边(B)->(A),然后在图的长度最小的环的长度就是答案,不过要特判几个东西:
- (n=0)的情况,答案为(0)
- 需要合成的点都在一个点上,答案为(1)
- 需要合成的点都在一条直线上,特判答案为(-1)还是(1)
1028 JSOI2007 麻将
以前做过这道题,不过一直wa,看了看代码,原来是判断胡牌错了,根据贪心,应该先取刻子(即完全相同的三张牌),再取顺子(即同花色且序数相连的序数牌)。
1029 JSOI2007 建筑抢修
考虑一个更简单的问题:判断是否能把所有的建筑抢修完?
判断方法应该不难想到:按T2从小到大排序,扫描一遍计算即可。
这个贪心证明也不难,先假设它们之中存在:对于$ i < j (,有) T2_i > T2_j (,然后发现交换)i(和)j$后必然不会更差!
这样子的话,我们就先按T2排序。接着我想到做个DP:设(f(i,j))表示前(i)个建筑抢修(j)个需要的最少时间。当然这个DP是(n^2)的。
QAQ
其实我们采用“后悔”的方式贪心就可以了。
先按T2从小到大尝试添加一个建筑,有两种情况:
- 这个建筑可以抢修,那么就抢修,并将答案加一。
- 这个建筑建造花费的时间比前面某一个已经抢修的建筑花费的时间要少,那么我们“后悔”抢修之前的那个建筑,替换成现在的建筑。