北大c语言算法基础<灌溉草场>

北大c语言算法基础
<灌溉草场>练习代码:

#include<iostream> 
#include<queue>
#define INFINITE 1 << 31	//左移31位的极大值

using namespace std;


int main() {
	const int MAXL = 100010;
	const int MAXN = 1010;
	int  f[MAXL];
	int cowThere[MAXL];
	memset(cowThere, 0, sizeof(cowThere));//奶牛在线上的占位
	
	struct Fx {
		int i, f;
		Fx(int ii = 0, int ff = 0) :i(ii), f(ff) {};
		bool operator<(const Fx& a) const { return f > a.f; }	//谁大谁就小
	};
	priority_queue<Fx> qFx;	//优先级容器
	int N, L, A, B;	//奶牛数,线长,喷水最小和最大直径
	cout << "begin:";
	cin >> N >> L;
	cin >> A >> B;
	A <<= 1;	//左移,得到最小直径
	B <<= 1;

	//奶牛在线的占位设置
	int b, e;
	for (int i = 0; i < N; i++) {
		cin >> b >> e;
		cowThere[b+1] ++;
		cowThere[e]--;	//不直接赋-1,是为避免两个相邻边界时,只有-1
	}
	int cowSum = 0;
	for (int i = 0; i <= L; i++) {
		f[i] = INFINITE;	//f数组赋初值
		cowSum += cowThere[i];
		if (cowSum > 0) cowThere[i] = 1;
		else cowThere[i] = 0;
	}

	for (int i = A; i <= B; i = i + 2) {
		if (!cowThere[i])
		{
			f[i] = 1;	//不在奶牛范围的点都赋值1
			if (i < B + 2 - A)
				qFx.push(Fx(i,1));
		}
	}
	for (int i = B + 2; i <= L; i=i+2) {
		Fx fx;
		while (!qFx.empty()) {
			fx = qFx.top();
			if (fx.i < i - B)	//小于i-B的最小值扔掉
				qFx.pop();
			else
				break;
		}
		if (!qFx.empty())	//是否有最小值
			f[i] = fx.f + 1;
		qFx.push(Fx(i + 2 - A, f[i + 2 - A]));	//装入下一个值
	}
	if (f[L] == INFINITE)
		cout << "没有找到有效值";
	else
		cout << f[L];	
	
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值