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

版权声明:欢迎转载,注明出处QWQ https://blog.csdn.net/Mercury_Lc/article/details/85015740

题解:对于每个点 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;
}

猜你喜欢

转载自blog.csdn.net/Mercury_Lc/article/details/85015740