CF-1238 C.Standard Free2play

題目大意:ios

有一個牆,高度爲h,在每個高度處都有一個踏板,有的踏板是隱藏着的,有的是伸出來的,小人站在h高度處(題目保證h高度處的踏板必定是伸出來的),這個小人每站到一個踏板上,就能夠點一個開關,將他所在的踏板收回,並將下一個高度上的踏板改變狀態。小人只能最多落下兩層樓,若是從高度爲x處落到高度爲x-3處那就會摔的稀碎,固然你確定不想讓他摔死是否是,要是不想摔死就充錢!每充一塊錢就能指定一個踏板並改變他的狀態。如今問你最少充多少錢能不讓小人摔死。spa

 

作法:貪心,從第一個擋板開始往下跳,若是下面一直沒有擋板,那就一直往下跳,直到跳到有擋板的位置,咱們先停在他的上一個高度處,因此如今的狀態是,小人處於x高度處,x-1高度處有擋板,那麼咱們討論x-2高度處有沒有擋板:code

1.若是x-2高度處有擋板,那麼咱們在x處按動開關,x和x-1高度處的擋板都收起,小人剛好落在x-2高度處的擋板,此時站在x-2高度處要考慮的問題又和站在x-1高度處要考慮的問題同樣了blog

2.若是x-2高度處沒有擋板,那很顯然x和x-1處的擋板收起後小人就嗝屁了,因此咱們衝一塊錢,讓x-1高度處的擋板收起來,而後再按動開關的時候x-1高度處的擋板剛好伸出,小人正好落上去,接下來的操做仍然相同。io

綜上所述,問題的焦點就在於x-1處擋板下面的那個擋板是和它緊挨着仍是隔着一些高度。若是緊挨着就跳過這個問題,不然就衝一塊錢。是否是很簡單啊,老子想禿嚕了頭皮也沒想出來,最後仍是看了老外的代碼,&#*%^&_*,果真年紀大了不中用了。class

#include<iostream>
#include<cstdio>
#define maxn 200010
using namespace std;
int a[maxn],n,h,T;
int main(){
    scanf("%d",&T);
    while(T--){
        int ans=0;
        scanf("%d%d",&h,&n);
        for(int i=1;i<=n;i++)scanf("%d",&a[i]);
        a[++n]=0;
        for(int i=2;i<=n;i++){
            if(a[i]-a[i+1]>1)ans++;
            else i++;
        }
        printf("%d\n",ans);
    }
    return 0;
}
相關文章
相關標籤/搜索