校OJ: 1311 防御罩

刚刚问了一下舍友他学校OJ哪题不会,我给他发个博客,于是就选了这一题.

首先我们来分析一下题意,就是以最少的防御罩个数来覆盖所有的太空基地,所以这是一道贪心的区间覆盖问题.

翻了翻以前自己写的代码也是五味杂陈,八九十行可太秀了,于是重新写了一个,不过心太急了做了好几遍才写出来2333

那么下面上代码

/**
 *	校OJ: 1311 防御罩
 *	贪心区间覆盖 
 **/
#include <iostream>
#include <cstdio>
using namespace std;

const int maxn = 100+10;
int pos[maxn], ans, n, r;

int main() {
	scanf("%d %d", &n, &r);
	for(int i = 1; i <= n; i++)
		scanf("%d", &pos[i]);
	if(n == 1) ans = 1; //特判 
	int last = pos[1] + r, i = 1;
	while( last < pos[n] ) {
		ans++;
		int t = 0;
		if(pos[i] > last) { //如果这个位置超过了防御防御之内 
			last = pos[i]+r;
			while(pos[i] <= last) t = max(t, pos[i++]+r);
		}
		else while(pos[i] <= last) t = max(t, pos[i++]+r);
		last = t;
		while(pos[i] <= last) i++;
		//printf("Build %d---%d\n", last-2*r, last);
	}
	printf("%d\n", ans);
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值