河南省第七届ACM大学生程序设计竞赛 解题报告

        这两天把去年省赛的题挂到了OJ上,顺便练手。


A.物资调度(易)

        DP,类似01背包。dp(i,j)表示情况数,第一维表示考察到第i种物资,第二维表示总数量为j。显然,如果按照题目给的数据范围,答案会超出64位整型的范围,但是题目并没有要求取模,只能说数据太弱。


B.海岛争霸(易)

        Floyd算法,稍微修改一下状态转移方程就可以了。Floyd是求和,这题是取最大。


C.机器人(难)

        数论题,各种推。首先特判一下x=y=0的情况,必须s=t=0才能输出'Y'。接下来是x和y不全为0的情况,分析一下可以知道,用gcd()表示最大公约数,能跳到的最小不含0坐标是(gcd(x,y),gcd(x,y)),最小含一个0坐标是(2*gcd(x,y),0)。

        这样我们就得到了三种基本的跳跃单位:

(x,y)--①

(gcd(x,y),gcd(x,y))--

(2*gcd(x,y),0)--

        所以要拼出(s,t),最起码的要求是gcd(x,y)能整除s和t(s和t分别能用②跳到,但不一定同时满足),符合这个条件还不够,还需要满足下面两者之一:

(s-t)/gcd(x,y)是偶数(能用②和③跳到)

((s+x)-(t+y))/gcd(x,y)是偶数(能用①和②和③跳到)。


D.山区修路(难)

        DP+离散化。解题关键是要注意到不同的高度数并不多,无论使路段上升还是下降,总是可以调整到另一个已经存在的高度,使得结果最优。所以我们可以先将不同的高度离散化,再用DP解决。dp(i.j)表示已经考察到路段i,把路段i调整到离散化后的第j个高度情况下的最优解。注意调整后路段需要单调不增或单调不降。


E.世界之威(难)

        图的遍历。首先是建图,如果u克制v,就连一条有向边uv。因为一种武器只能克制一种武器,所以图的结构可能出现链和环,还有可能多条边汇聚在一个点,不可能出现一个点引出多条边。首先我们找到所有入度为0的点,这些武器肯定是不能卖的,因为无法克制它们。如果u入度为0,我们就从u开始遍历,一定能得到一条链,这条链的贡献就是链长度/2。把所有入度为0的点处理完后,所有的链就处理完了,剩下的就是环。从每个环的任意一个点开始遍历,得到环的长度,这个环的贡献就是环长度/2。


F.Turing equation(易)

        就是把一个表达式上的数各位反转一下,然后验证表达式的正确性。


G.Code the Tree(易)

        还是模拟题。根据给的串建树,左括号进入下一层,右括号返回上一层。建树完成后,维护每个点的度,依次删除度为1的最小的点和它唯一的边,输出边连接的另一个点。注意树根也可以作为叶子,只要点的度为1,它就是叶子。


H.Rectangles(易)

        记忆化搜索(DP),经典的DAG最长路问题。注意矩形是可以旋转的,是否可嵌套的判断不要写错。然后建图(不建图也可以,在搜索的时候扫一遍判断)对每个点dfs一次取最大结果就可以了。


I.Earthquake(难)

        最大流最小割定理。把所有给总部打电话说过不去的村庄看成源,总部看成汇,“被破坏村庄的最少的数量”其实就是图的最小割,因为要使得源和汇之间无法连通,根据最大流=最小割,跑一下最大流即可求得。建图时,把每个村庄拆成2个点,一个入点,另一个出点,连接入->出,容量为1。如果u-v有边,就连接u出->v入和v出->u入,容量无穷大。建立一个超级源,流向所有通不到总部的点的出,流量无穷大,汇点即为总部的入点。跑最大流算法即可。



        我已经无力吐槽了,感觉命题组一点也不负责任,出现了各种描述错误数据错误,出原题就算了,连起码的造数据的能力都没有。

你可能感兴趣的:(解题报告)