HIT_Training_20140415

来源:互联网 发布:淘宝无线端链接生成 编辑:程序博客网 时间:2024/05/01 13:23

题目出处是前一阵不久的 2014 年浙江省省赛


http://acm.zju.edu.cn/onlinejudge/showContestProblems.do?contestId=355


比赛选择题目的时候直接把过的人极少的 H 题 和 K 题直接去了


官方题解人人上有。。这里写下一份自己的 + 感想。。


自己还是太弱了。。被屠成了一条狗也是意料之中QAQ


A、


B、

简单的状压 DP。。不过我实在是太傻逼了。。多了一维行数。。直接导致 TLE 全场。。其实是完全不用考虑行数的。。因为行数的限制直接可以归到状态的 1 的个数中。。


C、

现在还不太会证。。比赛的时候一度想用奇怪的方法去尝试也是浪费了不少时间。。最后猜了个结果。。证明待补

证明(大概是对的?不过很麻烦。。):

假设有 n 个数,不妨设 a_1 <= a_2 <= .. <= a_n
那么答案是 max(a_n, (sum - 1) / m + 1)
分两种情况。。
一、
a_n * m > Σa_i
这种情况我们从 m 个中直接拿出一个来一直处理 a_n 。。于是情况就变成了 a_1 .. a_n-1, m = m - 1;并且答案 >= a_n
如果剩下的数仍然满足 a_n-1 * (m - 1) >= Σa_i,继续做这种操作。。注意每次取走的 a_n, a_n-1…… 是单调不增的。。因此这么操作后答案仍旧是 >= a_n 的
显然至少会在 m = 1 的时候停止这种操作。。
此时便有了第二种情况: a_n * m <= Σa_i
这种情况我们要证的是一定有一种方法使得除了最后一次操作,每次一定有一种方法来选 m 个 >= 1 的 a_i;能证出来的话这种情况的答案就是 (sum - 1) / m + 1
而这个用数学归纳可以证明。。
还有一点就是 (sum - 1) / m + 1 是会随着第一种操作单调不增。。
所以直接判断原始序列 a_n * m 和 Σai 的关系即可
有点麻烦。。不过从情理上讲应该是对的。。?。。应该是证麻烦了www


D、

(不会


E、

我的做法是。。注意涂完一行或一列后当前行或列一定是一个颜色,根据这个性质倒着模拟就行;

官方做法也挺赞,根据每个格子的颜色可知是先涂的当前行还是当前列,那么就可以根据先后顺序连一条有向边,最后拓扑排序就行。。如果有环说明无解。


F、

比赛的时候一直卡着 B 这题也一直没出什么好思路。。赛后再看感觉不难嘛。。(弱者为何而战!

每个相同的颜色缩点,然后枚举一个点以它为中心找离它最远的点的距离。。最近的值即是答案。。(虽然不会严格证,不过感觉 YY 一下也可得出。。最优策略是固定一个点使劲按到最后。。如果有按不同的点最后再合并的话。。找它们的 “中点” 使劲按到最后并不会比这个结果差。。大概就是这么个证法?。。

我的 AC 代码:http://acm.hust.edu.cn/vjudge/contest/viewSource.action?id=2157501

(因为 bfs 的时候写差了导致 MLE 了数发才过。。这种脑残错误以后得少犯= =。。而且好像用邻接矩阵写会简单一点。。这份代码写的也算是很难看了ww


G、


H、

(雾


I、

好赞的一题啊。。

首先得读懂题目条件。。题目要求找到一个无限长的串满足:1、不能包含 banned 串;2、不能是某个串的循环。

比赛的时候思路一直禁锢在找两个单独成立并且连一块不会被 ban 的串。。然后到最后也是完全没想出一个可行的算法。。偏到不知道哪去了

官方题解简直赞。。

先建立个 trie 图。。然后跑强连通分量!。。对源点能达到的强连通分量判断一下是不是都是简单圈,如果都是的话则 No,否则 Yes;因为是简单圈的话一定会陷入一个死循环

好屌啊。。!

我的 AC 代码:http://acm.hust.edu.cn/vjudge/contest/viewSource.action?id=2160390

感觉写的好繁琐。。


J、

费马小定理算循环节


K、

(雾


L、


0 0
原创粉丝点击