1. 程式人生 > >B. Heaters ( Codeforces Round #515 (Div. 3) )

B. Heaters ( Codeforces Round #515 (Div. 3) )

題解:對於每個點 i 來說,從 j = i + r - 1 開始往前找,如果找到一個 a [ j ] 是 1 ,那麼就把它選上,但是我們需要判斷交界處,也就是如果前面選的那個可以讓這個點變溫暖,就不用再選多餘的了。這樣就記錄一下前一個 last ,要滿足 j > last。找到之後,就更新 i 的值,在 i + k 之間的都可以由選的這個點來溫暖。

#include <iostream>
#include <bits/stdc++.h>
using namespace std;

int a[2005];

int main()
{
    int n,r;
    while(scanf("%d%d",&n,&r) != EOF)
    {
        memset(a,0,sizeof(a));
        for(int i = 1; i <= n; i ++)
        {
            scanf("%d",&a[i]);
        }
        int num = 0;
        int last = 0,j,k;
        for(int i = 1; i <= n;)
        {
             j = i + r - 1;
             k = 0;
            while(j > last)
            {
                if(a[j])
                {
                    k = j;
                    break;
                }
                else j --;
            }
            if(k == 0) {printf("-1\n");return 0;}
            else {
                last = k;
                num ++;
                i = r + k;
            }
        }
        printf("%d\n",num);
    }
    return 0;
}