noip 2014民间题解
2014-11-08 13:57:22 By ydc 萌萌哒ydc来放题解了
先放day1,day2明天才考
T1:
考你会不会编程
T2:
n 个点n?1 条边的无向连通图就是个树
考虑距离为2的点对,可以理解为枚举i ,i 能走到的点集两两之间距离为2
我们要做的是对于一个数组a 1 ,a 2 ,a 3 ,…,a m ,要求a i a j ,i≠j 的Σ与max
max是个很简单的事情,你只要求a 数组的最大值与次大值即可
至于Σ,我们知道∑ i=1 n ∑ j=1 n a i a j =(∑ i=1 n a i ) 2 ,于是容易推出我们要求的就是(∑ i=1 n a i ) 2 ?∑ i=1 n a 2 i
当然你也可以令s=∑ i=1 n a i ,求∑ i=1 n a i (s?a i )
复杂度应该是O(n) 的
T3
我们很容易看出一个很经典的完全背包的框架:我们可以在某个时刻上升1,2,3,…∞ 次,有n 个时刻
当然根据题意,这题和完全背包有很多的不同,比如能下降,不能选择上升0 次,下界不可到上界不可越,有些位置不允许,等等等等
即使如此,我们仍然能以完全背包的思想为核心,解决这个题
由于是完全背包,显然可以用滚动数组优化将空间降为O(m) 。为了便于理解,我们用二维状态来描述:dp i,j 表示横坐标为i ,纵坐标为j 的最小步数
由于不能上升0 次,我们这样转移:dp i,j =max(dp i?1,j?x i +1,dp i,j?x i +1)
由于有障碍,我们求出dp i,j 后再将障碍位置的值赋值为∞
由于上界可以越过,所以要特殊转移一下,dp i,m =max(dp i?1,k +s k ) ,s k 为k 达到m 处的花费,他是个式子,在此不将其展开
最后由于能下降,所以dp i,j 还可以由上一步在j+y i 的状态转移
如此问题就解决了,时间复杂度O(nm)