这个B题比C题还难...
有一个含有n个元素的数组,数组中有一些"加热器",每个加热器有一个相同的范围R,假设一个加热器的下标是X,那么这个加热器加热的范围是[X-R+1,X+R-1]。一开始所有的加热器处于关闭状态,问至少要打开几个加热器可以使数组内的N个元素全部被加热。
脑子越来越愚钝了。看了题解,维护一个从左边起被加热器加热的最右边的下标就行。
一开始就想错了,直接奔着“全局最优”去了,但是事实上我所考虑的全局最优并不是真的最优解...我所考虑的是每次搜索时把整个范围都向前推进,却没有考虑在新的范围内可能没有符合的解,但是在之前的范围内有解。
#define _CRT_SECURE_NO_WARNINGS
#include <cstdio>
#include <algorithm>
#include <deque>
#include <iostream>
#include <string>
using namespace std;
int n, r;
int temp[1005];
int ans;
int last;
int pos;
int firstHeater;
bool flag;
int main() {
flag = true;
scanf("%d %d", &n, &r);
for (int i = 1;i <= n;++i) {
scanf("%d", &temp[i]);
}
for (int i = r;i >= 1;--i) {
if (temp[i] == 1) {
firstHeater = i;
break;
}
if (i == 1) {
flag = false;
}
}
if (flag) {
ans++;
last = firstHeater + r - 1;
while ((last < n)&&flag) {
int j;
int x = last + r;
if (x > n) {
x = n;
}
for (j = x;j >= last - r + 2;--j) {
if (temp[j] == 1) {
last = j + r - 1;
ans++;
break;
}
if (j == last - r + 2) {
flag = false;
}
}
}
if (flag) {
printf("%d\n", ans);
}
else {
printf("-1\n");
}
}
else {
printf("-1\n");
}
//system("pause");
return 0;
}