目录
一、题解
1、T1(title)
这道题就是一道送分题,可以直接用选择结构求解,但如果不想打太多代码,还是用循环结构看起来比较舒服
2、T2(fight)
这个题我们观察题目,首先可以拿到龙虎两方的初始势力,然后再来找应该在什么地方“天降神兵”
一个线性遍历,逐个枚举每一个兵营,再判断如果在此兵营“天降神兵”,我们已有的最小差值会不会比“天降神兵”后的最小差值大,再对其进行更新
但这道题不能就此了事,因为不知道是哪位出题人,再题目中写下了这样一句话:“第 m号兵营中的工兵很纠结,他们不属于任何一方。”
所以如果我们在任何一个兵营“天降神兵”,都不能使初始最小值更新,那么我们就应该在第m号兵营“天降神兵”,也就是直接输出m,至于为什么不能输出0,无可奉告
3、T3(bus)
这个题也不知道各位看出来是DP没有,这个题搞得我很开心鬼火冒,刚刚开始还以为是暴(mǒ)力(nǐ)
所以我就来讲讲这个题该如何模拟DP
首先是状态的定义,我们用一个三维数组来DP:
我们用逆推的思想,dp[i][j][k]表示到第i个人时车还有j分钟到且现在有k个人在等车
我们现在来讲讲状态转移方程,因为我们输入后肯定要排序,此时就不妨将两个人之间等车的时间差拿到用wait数组保存
wait[i]表示第i个人到第i+1个人之见的时间差
(1) j > wait[i] (如图)
因为上一个状态中,也就是第i+1个人的状态中,车离第i+1个人的距离为j-wait[i],而等车的人数比现在第i个人的状态多一个,因为有k个人在等这班车,所以时间还要加上一个k*wait[i],此时:
dp[i][j][k] = dp[i + 1][j - wait[i]][k + 1] + k * wait[i]
(2) j <= wait[i]
第一种情况,第i+1个人也要坐这一班车(如图)
因为此时第i+1个人到了之后是不需要等车的,所以他刚刚到就可以坐上车,所以第i+1个人的状态中,车已经在等他了,所以j就为0,等车人数当然也要多一个,和上一种情况一样,也有k个人在等车,时间也要加上一个k*wait[i],此时:
dp[i][j][k] = dp[i + 1][0][k + 1] + k * wait[i]
第二种情况,第i+1个人不坐这班车(如图)
<