// 此博文为迁移而来,写于2014年11月3日,不代表本人现在的观点与看法。原始地址:http://blog.sina.com.cn/s/blog_6022c4720102verr.html
这次考试150分,相比之前的题目简单一些,而且还学到了一些东西——二叉搜索树。但是第三题数据太叼,暴力1分都没有真是不爽!还要搞什么状压DP,呵!r64大神220分虐场,还有我竟然踩了YMDragon哈哈哈哈哈哈哈哈。
1/折纸 【100分】【正解:数学】
Onise喜欢画画. 他有一张 width x height的纸.他在纸上的操作步骤如下:
- 从直线 x = xfold 对折. (是把左边的纸折到右边上面).
- 把纸竖直对折成cnt+1 等份. 就是把最上面的折到下面的, 共操作cnt 次.
- 现在Onise,画一个实心矩行,左下角的坐标是(x1, y1),右上角坐标是 (x2, y2). 注意: (x1, y1) 、(x2, y2) 是把纸折完之后的坐标,(0, 0)是左下角坐标, Onise画的那些格子的墨水都会渗到它对应的下层的那些格子.
- 再次展开纸.
例如:Onise有一张5 x 6的纸。他把直线x=2左边的纸折到右边去(如图1)。 cnt =2,则把纸竖直对折成3份(如图2-4)。然后,Onise画一个矩形(如图5,白色),左下角坐标是 (1, 1) ,右上角坐标是 (3, 2)。再次展开(如图6),图片省略。
考试的时候开始准备打个模拟,后来觉得自己是个宝。用数学方法找到规律就可以过了。
2/二叉查找树 【50分】【正解:平衡树】
二叉查找树是二叉树,每个结点最多只有两个孩子结点。每个结点都有一个整数权值val。如果某个结点的权值是X,那么她的左子树的结点权值都小于X,右子树的结点权值都大于X。现在要通过依次插入N个整数构造出二叉查找树,每个整数范围【1,N】,且都不相同,即要插入的序列是一个排列。第一个被插入的整数作为树根结点root,接下来依次插入剩下的N-1个整数,每次插入一个整数就相当于执行函数:insert(X, root),其中insert(X, root)递归过程如下:
insert( number X, node now )
{
计数器C 加1
I if 待插入的整数X小于结点now的权值 then
{
if 结点now无左孩子 then 新建一个权值为X的结点,并设置为now的左孩子
Else insert(X, now的左孩子)
}
Else
{
if 结点now无右孩子 then 新建一个权值为X的结点,并设置为now的右孩子
Else insert(X, now的右孩子)
}
}
其实本来不满清楚怎么构建树的,后来看了题目之后就知道了,根据题目直接打就有50分。听说正解是写平衡树,然后就不想写了以后再说吧。
3/游戏 【0分】【正解:状态压缩DP+优化】
农夫FJ和奶牛Bessie玩游戏,游戏由一个黑板和N张卡片组成。游戏初始时,黑板写的数字是0。每张卡片都写有一个[0,511]的整数。FJ和Bessie轮流操作,FJ先操作。操作者每次从当前的卡片中选取一张卡片出来(被选出来的卡片不会被再次利用),假设选出来的卡片写的数是X,并假设当前黑板写的数是Y,那么本轮操作后黑板的数变成Y|X,其中|是位操作的或。如果某个操作者没有卡片可取了(卡片已经取完),那么该操作者输。如果某操作者进行某次操作后,黑板上的数变成了511,那么该操作者输。假设FJ和Bessie都采取最优策略,那么最后胜利者是谁?
机智的我选择了打暴力。题目机智地让我爆了0.