CodeForces 1238C(思惟+貪心)

題意

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

您如今正在玩一個遊戲,您初始在一個高度 h 的懸崖ios

懸崖沿壁高度爲 1-h 的這些位置均有平臺,平臺有兩種狀態,被選中/不被選中,您能夠認爲只有被選中的平臺纔出如今這個懸崖上且你能夠站在上面。c++

初始時有 n 個平臺爲被選中,保證平臺 h 被選中,您每次能夠進行一個操做,不妨假設您當前站在平臺 x 處(此時平臺 x 必定被選中),即讓平臺 x 變成未被選中,而平臺x1 變成相反的狀態。spa

您很是的脆弱,因此不能跌落超過2的高度,好比您能夠從高度爲3的平臺跌落到高度爲1的平臺,但不能從高度爲3的平臺跌落到地面
.net

如今您想要回到地面,即高度爲0
htm

您可使用一種魔力水晶,即其能夠將任意一個平臺修改爲指定的狀態。blog

如今但願您求出回到地面最少須要使用多少顆魔力水晶?遊戲

思路

題意簡單來講就是踩在選中的平臺能夠按開關,使得緊挨着的下面那個平臺狀態反轉,不能連續跳超過2個平臺。ci

若是隔了很遠纔有一個平臺,顯然能夠按一次開關降低一格,由於下面那個平臺會由未選中反轉到選中,因此能夠踩。咱們一直這樣作,直到跳到選中的平臺的上一個,設此時位置爲x,且x和x-1是有平臺的,下面的爲x-1,x-2。get

若是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;
}
相關文章
相關標籤/搜索