因为我们要尽可能少,所以我们要用贪心的思想
我们从最左边开始扫,扫到一个没有被加热的点,我们就以这个点为起点向右扫,扫到能加热他的离他最远的一个加热器打开
(贪心的正确性在于这个加热器离他最远且能将它加热,如果选更近的则不更优,选更远的就加热不了他了)
然后将该加热器能加热的范围内的点打标记,继续扫下去即可
最坏时间复杂度O(N^2)
C++代码一
#include <bits/stdc++.h>
using namespace std;
const int MAXN=2e5+7;
typedef long long ll;
typedef pair<int,int> PII;
int n,m,r,d,a[MAXN],h;
int main()
{
scanf("%d%d",&n,&r);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
int pre=0,last=0,ans=0;
for(int i=1;i<=n;i++)
{
if(last>i)
continue;
int mk=0;
for(int j=i+r-1;j>=max(1,i-r+1);j--)
{
if(a[j])
{
mk=1;
ans++;
last=j+r;
// printf("%d\n",j);
break;
}
}
if(!mk)
return 0*printf("-1\n");
}
printf("%d\n",ans);
return 0;
}
C++代码二