题意:
有一个墙,高度为 h h h,在每一个高度处都有一个踏板,小人站在 h h h 高度处,这个小人每站到一个踏板上,就可以点一个开关,将他所在的踏板收回,并将下一个高度上的踏板改变状态。小人只能最多落下两层楼,如果从高度为 x x x 处落到高度为 x − 3 x-3 x−3 处那就会摔的稀碎,当然你肯定不想让他摔死是不是,要是不想摔死就充钱!现在问你最少充多少钱能不让小人摔死。
直接模拟即可
如果初始相邻两个突出的平台高度不连续那么我们显然可以直接从上面一步步操作到达下面的平台的上面一个位置,此时考虑如果我们直接操作,那么下面那个平台就会缩起来,如果当前和更下面的平台
y
y
y 高度超过
2
2
2 了,并且用在
x
x
x 位置和用在
x
x
x 下面一个位置都是一样的,那么直接用在
x
x
x 位置就好了如果和
y
y
y 高度不超过
2
2
2 ,那么我们显然直接操作然后落到
y
y
y 即可。
AC代码:
const int N = 2e5 + 7;
int q, n, m;
int a[N];
int ans, res, cnt;
int main()
{
sd(q);
while (q--)
{
sdd(n, m);
rep(i, 1, m)
sd(a[i]);
ans = 0;
rep(i, 2, m)
{
if (n <= a[i])
continue;
if (n != a[i] + 1)
n = a[i] + 1;
if (i < m)
{
if (a[i + 1] == a[i] - 1)
n = a[i + 1];
else
ans++, n = a[i];
continue;
}
if (n > 2)
ans++;
break;
}
pd(ans);
}
return 0;
}