Codeforces 1066B Heaters

这个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;
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值