//题意:有n个位置m个热水器每个热水器加热范围是[i-r+1,i+r-1],每个地方有热水器为一否则为零
//问至少需要多少个热水器可以保证每个地方至少被一个热水器加热,不能保证每个地方被一个热水器加热的话输出-1
//思路:贪心,首先我们先从r开始向前枚举这样可以保证前面被加热但后面也覆盖较多的位置.找到一个i时我们就要从
//2*r+i-1向前枚举因为枚举时尽量从第一个可以覆盖i~x的整个地方开始如下图
//这样的话可以保证用的热水器最少
//
AC代码如下
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<map>
#include<sstream>
#include<algorithm>
#include<queue>
#include<stack>
using namespace std ;
int main()
{
int n,r,s=0;
cin>>n>>r;
int a[2500];
for(int g=1;g<=n;g++)
cin>>a[g];
int flag=0,kk=0;
for(int i=r;;i++)
{
if(i>=n&&kk==1)break;//
flag=0;
int j,p;
if(kk==0)j=r;//第一次寻找
else j=2*r+i-1;//如图
if(kk==0)p=0;//第一次寻找
else p=i;//已经找到i,在i之后寻找
kk=1;//标记
for(;j>p;j--)
{
if(a[j]==1)
{
flag=1;
s++;
break;
}
}
if(flag)//找到
{
i=j-1;
if(i+r>=n)break;//如果找到的i可以把后面全覆盖就不用继续寻找
}
else//找不到
{
printf("-1\n");
return 0;
}
}
printf("%d\n",s);
}
简单贪心,思路最重要.
以上为小学弟(小菜鸡)第一点浅显理解,如果有什么错误和困惑欢迎在下面留言QAQ