Z君的密码
真就按照题意暴力模拟就行。没别的方法。
保护费
题意就是给一棵以1为根的有根树,求最少改变多少条边使得1到每个点的路径都满足安全边数量不少于危险边。
显然更改时贪心的想一定是尽量在深度较小处更新。为了统计结果,设数组a[i]表示从1到i路径上安全边与危险边的差值。显然当a[i]<0时这一点不合法。
然后我们对a数组在树上按照dfs序建一棵线段树,那么每次改一条边相当于把这条边连向的点以及它的子树的a数组+2,直接线段树修改。然后我们维护最小值,如果一个点子树最小值>=0说明这个点及其子树均合法,就可以返回了。dfs实现一下统计答案即可。
疏导交通
T3数据范围小,按照题意设计一个五维状态,dp[t][a][b][c][d],t表示当前枚举的时间,a,b,c,d分别表示每个方向当前处理的车的数量。
我们再用car[1/2/3/4][t]表示时间为t时各个方向车的数量。显然只要某个方向car大于l+1则无解。
转移方法与背包问题相同。
输出min(dp[60][a][b][c][d])即可。