第一题
【题目及题号】number superoj1002
【题解】
题意大概是求前R个由不同的三次幂组成的数的和。
考虑转换成三进制。
那么就会发现和项数有关。
1:—-1
2:—3-
3:—31
4:—9—
5:—9-1
6:—93-
……
看上去非常像二进制的递增。所以我们可以统计第i位上的
3i−1
分别出现了多少次。
我的做法是递归去求。
对于R,找到一个最大的
2k
,满足
2k
<=R,那么
多出来的那一部分如果除去最高位的贡献,
就可以去递归求解 (R−2k) 了。
【注意】
据说本题中间过程爆longlong要开unsigned;然而我没有开也过了Orz。
第二题
【题目及题号】dp superoj1003
【题解】
本题其实是一道做过的题,但是我没有A掉,只拿了70分我感到非常地抱歉。Orz我对不起党和祖国还有人民,对不起我自己。
因为本题要求最大化最矮的高度,所以考虑二分。
那么如何验证这个高度是否合法呢?我们可以使用DP,对于第i位预处理出它前面k位(含)状态为j的高度。
转移的时候删掉一位插入一位状态,求一个满足高度的最小花费。
f[i+1][(j>>1)|(1<<(k-1))] = min(f[i+1][(j>>1)|(1<<(k-1))],f[i][j]+c[i+1];
f[i+1][(j>>1)|(1<<(k-1))] = min(f[i+1][(j>>1)|(1<<(k-1))],f[i][j]);
【注意事项】
1.对于前驱状态j当前第i位的高度要预处理。
2.即使遇到做过的题也不要窃喜,因为你很有可能想掉最关键的东西。
比如今天,我忙着去想起了状态,忘掉了最重要的二分。
第三题
【题目及题号】change superoj1004
【题解】
本题一看就是傻逼题。建立一个映射,每次交换就可以交换映射,对于x,y输出a[ys[x]][ys[y]]即可。
【注意事项】
1.非常重要的一点:注意数据不合法,要跳空格!!!
2.对拍不仅要拍主程序,最好读入方式也区别一下。(有时间的情况下)