Ag T3
在一个 0 0 0 到 N N N 的数轴上 , 有一只奶牛从 0 0 0 出发 ,左右移动 , 经过 T T T 秒回到 0 0 0 , 已知奶牛经过 0.5 , 1.5... ( N − 1 ) . 5 0.5 ,1.5...(N-1).5 0.5,1.5...(N−1).5 的次数 , 输出最小转变方向数的一种方案 ( 其中 T = ∑ a i T=\sum a_i T=∑ai )
题目要求最小转向次数 , 因此我们尽量不转变方向
假设当前在 pos
若向右走 , 则能向右就继续向右 , 否则转向
若向左走 , 若 pos 前面的
a
a
a 值不等于
1
1
1 , 显然可以继续向左走
若 pos 前面的
a
a
a 值等于
1
1
1 , 那么分两种情况 :
case1 : pos 后面的
a
a
a 值都为
0
0
0 , 那么继续往左走
case2 : pos 后面的
a
a
a 值不为
0
0
0 , 那么转向向右走
复杂度 O ( T ) O(T) O(T)
Au T3
与 Ag T2 同背景 , 问满足最小转向数的方案数
例如 :
2
6 4
那么在 0 0 0 到 1 1 1 段应该经过了 3 3 3 组来回 , 在 1 1 1 到 2 2 2 段应该经过了 2 2 2 组来回, 那么在 01 01 01 段中选 2 2 2 组衔接上上 12 12 12 段中的来回均为合法方案 , 因此答案为 C 3 2 C_3^2 C32
而对于 :
2
4 6
考虑到最小转向次数 , 初末两次来回一定经过 0 0 0 到 2 2 2 整段 , 因此图中红色部分必选 , 剩下的可任意衔接即可 , 因此答案为 C 3 − 1 2 − 1 = C 2 1 = 2 C_{3-1}^{2-1}=C_2^1=2 C3−12−1=C21=2
这样我们就得到了任意相邻两段之间的方案数 :
( 先将 a [ i ] a[i] a[i] 除以 2 2 2 表示来回数 )
{ C a [ i ] a [ i + 1 ] a [ i ] ≥ a [ i + 1 ] C a [ i − 1 ] a [ i + 1 ] − 1 a [ i ] < a [ i + 1 ] \begin{cases} C_{a[i]}^{a[i+1]} & a[i]\ge a[i+1]\\ \\ C_{a[i-1]}^{a[i+1]-1} & a[i]<a[i+1] \end{cases} ⎩ ⎨ ⎧Ca[i]a[i+1]Ca[i−1]a[i+1]−1a[i]≥a[i+1]a[i]<a[i+1]
最终乘法原理相乘即可