北京林业大学12月8日月赛题目解题报告
OJ地址 http://acm.bjfu.edu.cn
1. 2.签到题
int(n / 10)就是A题的解,B题就贪心的每次用最高价去找钱。
3.阅读理解
读懂英文,前面都没啥用,就只要知道这种投票的方式。全是奇数,所以处理起来 n/2+1
4.经典递推公式
dp[n] = dp[n-1] + dp[n-2]*2 对于这个递推式可以采用构造矩阵倍增得到
1 2 * dp[n-1] = dp[n]
1 0 dp[n-2] dp[n-1] 矩阵快速幂可以得解
另一种直观的方式是化简递推式得到公式为 dp[n] = 2^n + 2 * ((n & 1LL) ? -1 : 1)
注意超int的处理方式
使用快速幂对int取模,解决。
5.基于贪心策略的消除
题意可以理解为每次用一条消息消除一个粉丝,那么如果有办法维护一个集合使得集合内消息的优秀度都能消掉这个人,就可以在这个集合中找一个最小整理难度消掉这个人。
这时的贪心策略为按人的期望值和消息的优秀度从大到小排序,对每个人维护能大于这个人期望值的所有消息的集合,取最小。
这题的高效做法是小顶堆,当然暴力完全可以过掉。
6.递归解决子问题的好题,也可建一棵结点为字符串的字典树,朴素构造方法既解
更简洁的做法是递归。贴个代码片段供大家参考。要理解递归对问题向子问题的转化。
void solve(int from, int to, int pos) { if (pos == 7) return; int f; while (from <= to) { f = from; while (f < to && check(f, f + 1, pos)) f++; for (int i = 0; i < pos; i++) printf(" "); for (int i = L[pos]; i <= R[pos]; i++) putchar(s[f].str[i]); puts(""); solve(from, f, pos + 1); from = f + 1; } }
7.贪心解决最长连续有人,和最长连续无人。
记录所有区段的左右位置,按左边排序,一个个扫描维护一个最长连续有人区间。如果新线段包含在之前连续区间,舍弃;新线段左在连续区间内,右点在连续区间外,就可以延长这个最长连续有人区间的右值,更新有人连续最大值。否则完全在外面,更新维护的区间左右值,更新最长无人区间长度。此题即解。
此题数据范围较小,否则类型题需考虑是否需要离散化端点。
8.画A,找到一点规律就可以。这题对格式要求很严格。
一种比较方便的做法是在一个n*2n的空矩阵中对路径更新为1,按1输出*,输出时要注意右侧没有空格,每组样例中间有空行,最后一组没有空行。
9.田忌赛马问题的基础变形
贪心的策略:
一、当田忌最快的马比国王最快的马快时,用田忌最快的马赢国王最快的马。
二、当田忌最快的马比国王最快的马慢时,用田忌最慢的马输给国王最快的马。
三、当田忌最快的马跟国王最快的马一样快时,分情况。
1、当田忌最慢的马比国王最慢的马快,那么用田忌最慢的马赢国王最慢的马
2、当田忌最慢的马比国王最慢的马慢,那么用田忌最慢的马输给国王最快的马
3、当田忌最慢的马跟国王最慢的马相等的时候,用田忌最慢的马跟国王最快的马比
按照这个策略就能得到最大勇武。但是这道题严格规定了上下界,超过上下界值就为上下界的值。
10.博弈问题 博弈搜索树
赛事总结
Write By Sks