zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    spring-boot4
    spring-boot3代码
    spring-boot3
    spring-boot2代码
    spring-boot2
    Java Socket编程
    eclipse项目中.classpath文件详解
    spring-boot1
    ASCII 在线转换器
    如何在Android开发中让你的代码更有效率
  • 原文地址:https://www.cnblogs.com/jasonlixuetao/p/9818949.html
Copyright © 2011-2022 走看看