北大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;
}