题意:一个数组只含有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; }