CodeForces 1238C(思维+贪心)

题意

https://vjudge.net/problem/CodeForces-1238C

您现在正在玩一个游戏,您初始在一个高度 h 的悬崖

悬崖沿壁高度为 1-h 的这些位置均有平台,平台有两种状态,被选中/不被选中,您可以认为只有被选中的平台才出现在这个悬崖上且你可以站在上面。

初始时有 n 个平台为被选中,保证平台 h 被选中,您每次可以进行一个操作,不妨假设您当前站在平台 x 处(此时平台 x 一定被选中),即让平台 x 变成未被选中,而平台x1 变成相反的状态。

您非常的脆弱,所以不能跌落超过2的高度,比如您可以从高度为3的平台跌落到高度为1的平台,但不能从高度为3的平台跌落到地面

现在您想要回到地面,即高度为0

您可以使用一种魔力水晶,即其可以将任意一个平台修改成指定的状态。

现在希望您求出回到地面最少需要使用多少颗魔力水晶?

思路

题意简单来说就是踩在选中的平台可以按开关,使得紧挨着的下面那个平台状态反转,不能连续跳超过2个平台。

如果隔了很远才有一个平台,显然可以按一次开关下降一格,因为下面那个平台会由未选中反转到选中,所以可以踩。我们一直这样做,直到跳到选中的平台的上一个,设此时位置为x,且x和x-1是有平台的,下面的为x-1,x-2。

如果x-2有平台,那么可以按x的开关,然后就跳到x-2了。

如果x-2没有平台,那么按了x的开关后,跳的距离肯定是大于2的了,因为x-1也收回了平台。这种情况就死了,需要一个水晶使得x-1的状态先改为未选中,这样就可以像开始说的那样往下一步一步的跳,直到跳到有平台的上一格,那么情况又和上面一样了。

总结,除去第一个平台(h),往下跳,每遇到两个距离>1的平台(x-1有平台,x-2没有平台的情况),那么需要一个水晶,跳到x-2。否则就跳过这些平台,跳到x-3平台的上一格继续考虑。

代码

#include<bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f3f
#define ll long long
const int N=200005;
const int mod=1e9+7;
const double eps=1e-8;
const double PI = acos(-1.0);
#define lowbit(x) (x&(-x))
ll p[N];
int main()
{
    std::ios::sync_with_stdio(false);
    int q;
    cin>>q;
    while(q--)
    {
        ll h,n;
        cin>>h>>n;
        for(int i=1;i<=n;i++)
            cin>>p[i];
        ll cnt=0;
        p[n+1]=0;
        for(int i=2;i<=n;i++)
        {
            if(p[i]-p[i+1]>1)
                cnt++;
            else i++;
        }
        cout<<cnt<<endl;
    }
    return 0;
}

  

posted @ 2019-12-03 23:23  MCQ1999  阅读(341)  评论(0编辑  收藏  举报