• 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
    ");
            else 
                printf("%d
    ",res);
        }
        return 0;
    }
  • 相关阅读:
    JavaScript 获取来源地址
    JavaScript 调试&显示变量
    JavaScript Math对象
    JavaScript 封闭函数
    常见泛型委托
    使用BindingSource绑定数据库
    Case Reply
    RSS订阅
    ADO.NET
    泛型的优点
  • 原文地址:https://www.cnblogs.com/jasonlixuetao/p/9818949.html
Copyright © 2020-2023  润新知