codeforces_1066_B.Heaters

题意:一个数组只含有0或1,1表示该元素可以覆盖其自身、左边r-1个元素和右边r-1个元素,问最少保留多少个1元素可以覆盖整个数组。

思路:一个指针指向当前未被覆盖的最左边的元素下标,每次找离它最远且能够覆盖它的一个1元素来覆盖,并更新指针。

#include<iostream>
#include <string.h>
#include<cstdio>
using namespace std;

int main()
{
    int n,r;
    while(scanf("%d%d",&n,&r)!=EOF)
    {
        int cnt=0,heater[1005];
        for(int i=0;i<n;i++)
        {
            int num;
            scanf("%d",&num);
            if(num==1)
                heater[cnt++]=i;
        }
        int left=0,flag=-1,i,res=0;
        for(i=0;i<cnt;i++)
        {
            int ll=heater[i]-r+1;
            int rr=heater[i]+r-1;
            if(ll>left)
            {
                if(flag>=0)
                {
                    res++;
                    left=heater[flag]+r;
                    if(ll<=left)
                        flag=i;
                    else 
                        flag=-1;
                }
                else 
                    break;
            }
            else 
                flag=i;
        if(i==cnt)
            if(left<n)
                if(flag>=0)
                    if(heater[flag]+r>=n)
                    {
                        res++;
                        left=heater[flag]+r;
                    }
        if(left<n)
            printf("-1\n");
        else 
            printf("%d\n",res);
    }
    return 0;
}

 

posted on 2018-10-19 21:29  JASONlee3  阅读(173)  评论(0编辑  收藏  举报

导航