离线赛20171004总结

来源:互联网 发布:c语言心形图案代码下载 编辑:程序博客网 时间:2024/05/21 21:47

1.总结:

这次考真题,题目比较简单,但是还是没有考好,原因比较简单,那就是因为我太过于自信了,看到第二题第三题比较简单,所以就直接打正解了,后来也没有去打个暴力对拍一下,其实只要稍微对拍一下就有80分,第三题乖乖打暴力又有60分,这样下来就有250分,然而我只考了155分。无论什么时候都不要忘记对拍,什么时候都优先打暴力,不然正解也是要对拍的。
 

2.题目分析

1.联合权值
 

【问题描述】
  无向连通图 G 有 n 个点,n-1 条边。点从 1 到 n 依次编号,编号为 i 的点的权值为 Wi , 每条边的长度均为 1。图上两点(u, v)的距离定义为 u 点到 v 点的最短距离。对于图 G 上的点对(u, v),若它们的距离为 2,则它们之间会产生Wu×Wi的联合权值。请问图 G 上所有可产生联合权值的有序点对中,联合权值最大的是多少?所有联合权值之和是多少?
  
【输入】
输入文件名为 link.in。 第一行包含 1 个整数 n。
接下来 n-1 行,每行包含 2 个用空格隔开的正整数 u、v,表示编号为 u 和编号为 v 的点 之间有边相连。
最后 1 行,包含 n 个正整数,每两个正整数之间用一个空格隔开,其中第 i 个整数表示 图 G 上编号为 i 的点的权值为 Wi。
 
【输出】
输出文件名为 link.out。
输出共 1 行,包含 2 个整数,之间用一个空格隔开,依次为图 G 上联合权值的最大值 和所有联合权值之和。由于所有联合权值之和可能很大,输出它时要对 10007 取余。

解析:
 这个题目本身并不是很难,其实只要考虑到只要找两部内的,其实是有规律的。根据考试时候的想法,我是分类讨论了,一个是向上走Fa[x][1]步就可以,还有就是同一个父亲节点,只要计算一个前缀和,就可以用O(n)的复杂度求出答案。
 但是其实还有更好的方法,我这样想其实变复杂了,只用考虑所有节点的儿子节点(因为是双向图),只要一次计算就好了,无需分类讨论。但两个的正确性都是毋庸置疑的。
 然而最后我只有30分的原因,实在题目的加注处,它只让我把ans取模,却没有让我取模Max。这种失分看起来非常可笑,但是如果在真正的考试中犯了,就有可能一失足成千古恨。

 
  
2.飞扬的小鸟
 

【问题描述】
Flappy Bird 是一款风靡一时的休闲手机游戏。玩家 需要不断控制点击手机屏幕的频率来调节小鸟的飞行高度,让 小鸟顺利通过画面右方的管道缝隙。如果小鸟一不小心撞到了 水管或者掉在地上的话,便宣告失败。
为了简化问题,我们对游戏规则进行了简化和改编:
1. 游戏界面是一个长为 n,高为 m 的二维平面,其中有
k 个管道(忽略管道的宽度)。
2. 小鸟始终在游戏界面内移动。小鸟从游戏界面最左边 任意整数高度位置出发,到达游戏界面最右边时,游 戏完成。
3. 小鸟每个单位时间沿横坐标方向右移的距离为 1,竖直移动的距离由玩家控制。如 果点击屏幕,小鸟就会上升一定高度 X,每个单位时间可以点击多次,效果叠加; 如果不点击屏幕,小鸟就会下降一定高度 Y。小鸟位于横坐标方向不同位置时,上 升的高度 X 和下降的高度 Y 可能互不相同。
4. 小鸟高度等于 0 或者小鸟碰到管道时,游戏失败。小鸟高度为 m 时,无法再上升。 
现在,请你判断是否可以完成游戏。如果可以,输出最少点击屏幕数;否则,输出小鸟 最多可以通过多少个管道缝隙。
 
【输入】
输入文件名为 bird.in。
第 1 行有 3 个整数 n,m,k,分别表示游戏界面的长度,高度和水管的数量,每两个 整数之间用一个空格隔开;
接下来的 n 行,每行 2 个用一个空格隔开的整数 X 和 Y,依次表示在横坐标位置 0~n-1 上玩家点击屏幕后,小鸟在下一位置上升的高度 X,以及在这个位置上玩家不点击屏幕时, 小鸟在下一位置下降的高度 Y。
接下来 k 行,每行 3 个整数 P,L,H,每两个整数之间用一个空格隔开。每行表示一 个管道,其中 P 表示管道的横坐标,L 表示此管道缝隙的下边沿高度为 L,H 表示管道缝隙 上边沿的高度(输入数据保证 P 各不相同,但不保证按照大小顺序给出)。
 
【输出】
输出文件名为 bird.out。 共两行。
第一行,包含一个整数,如果可以成功完成游戏,则输出 1,否则输出 0。 第二行,包含一个整数,如果第一行为 1,则输出成功完成游戏需要最少点击屏幕数,
否则,输出小鸟最多可以通过多少个管道缝隙。

 
解析:
 
 这个题目一开始以为是模拟,然后我在写note的时候,发现这会有很多重复计算,然而每一个格子只要计算出最优值就好了,这就是标准的dp。然而每走一步都可以点好几次。当时在考试没考虑到,只想到从前面一个一个转移,这样就只有70分。在考试的时候bugde不出来,同时也要用多重背包优化,这能写出来我实在是佩服,因为我在赛后也想错了好多次,很多细节没考虑到,就比如说在转移的时候,我遇到是管道的情况就continue掉了,然而这会导致后面的dp递推错误。这种细节如果我不是错了很多次是无法知道了。

3.反思:

 以后再次考离线赛的时候,无论题目简单不简单,优先打暴力,该拿的裸分要先拿到,保证自己的暴力正确之后,如果有时间再尝试去打正解。这样心里有个底,并且正解也可以对拍,一举两得。
 同时,题目一定要看仔细了,什么该模的没有模,不该模的模了,这是非常智障的。一定要想仔细了再开始敲代码,不然敲到一半再停下来就来不及了。

原创粉丝点击