给定N个闭区间,请你在数轴上选择尽量少的点,使得每个区间内至少包含一个选出的点。输出选择的点的最小数量
struct P {
int l, r;
bool operator <(const P& rhp)const {
return r < rhp.r;
}
}segs[maxn];
void solve() {
sort(segs, segs + N);
int ans = 0, last = -2e9;
for (int i = 0; i < N; i++) {
if (last < segs[i].l) {
last = segs[i].r;
ans++;
}
}
printf("%d\n", ans);
}
参考例题:POJ 1328 Radar Installation
给定N个闭区间,请你在数轴上选择若干区间,使得选中的区间之间互不相交(包括端点)。输出可选取区间的最大数量。
struct P {
int l, r;
bool operator <(const P& rhp)const {
return r < rhp.r;
}
}segs[maxn];
void solve() {
sort(segs, segs + N);
int ans = 0, last = -2e9;
for (int i = 0; i < N; i++) {
if (last < segs[i].l) {
last = segs[i].r;
ans++;
}
}
printf("%d\n", ans);
}
给定N个闭区间,请你将这些区间分成若干组,使得每组内部的区间两两之间(包括端点)没有交集,并使得组数尽可能小。
struct P {
int l, r;
bool operator <(const P& rhp)const {
return l < rhp.l;
}
}segs[maxn];
void solve() {
sort(segs, segs + N);
priority_queue<int, vector<int>, greater<int> > que;
for (int i = 0; i < N; i++) {
auto p = segs[i];
if (que.empty() || que.top() >= p.l) que.push(p.r);
else {
que.pop();
que.push(p.r);
}
}
printf("%d\n", que.size());
}
参考例题:POJ - 3190 Stall Reservations
给定N个闭区间以及一个线段区间,请你选择尽量少的区间,将指定线段区间完全覆盖。输出最少区间数。若无法覆盖,输出“-1”
struct P {
int l, r;
bool operator <(const P& rhp)const {
return l < rhp.l;
}
}segs[maxn];
void solve() {
sort(segs, segs + N);
bool success = false;
int res = 0;
for(int i = 0; i < N; i++){
int j = i, r = -2e9;
while (j < N && segs[j].l <= st) {
r = max(r, segs[j].r);
j++;
}
if (r < st) {
res = -1;
break;
}
res++;
if (r >= ed) {
success = true;
break;
}
st = r;
i = j - 1;
}
if (!success) res = -1;
printf("%d\n", res);
}
int N, st = 0, ed;
struct P {
int l, r;
bool operator <(const P& rhp)const {
return l < rhp.l;
}
}segs[maxn];
void solve() {
sort(segs, segs + N);
bool success = false;
int res = 0;
for (int i = 0; i < N; i++) {
int j = i, r = -2e9;
while (j < N && segs[j].l <= st + 1) {
r = max(r, segs[j].r);
j++;
}
if (r < st) {
res = -1;
break;
}
res++;
if (r >= ed) {
success = true;
break;
}
st = r;
i = j - 1;
}
if (!success) res = -1;
printf("%d\n", res);
}
其实就是每次选出最小的两个数合并。用优先队列就可。
省去代码。
一头牛的风险值等于,它头上所有牛的总重量(不包括它自己)减去它的身体强壮程度的值,您的任务是确定奶牛的排序,使得所有奶牛的风险值之和的尽可能地小。
在一条数轴上有 N 家商店,现在需要在数轴上建立一家货仓,使得货仓到每家商店的距离之和最小。
void solve() {
sort(a, a + N);
ll ans = 0;
for (int i = 0; i < N; i++) {
ans += abs(a[i] - a[N / 2]);
}
printf("%lld\n", ans);
}
一头牛的风险值等于,它头上所有牛的总重量(不包括它自己)减去它的身体强壮程度的值,您的任务是确定奶牛的排序,使得所有奶牛的风险值最大值尽可能的小。
void solve() {
sort(a, a + N);
int sum = 0, ans = -2e9;
for (int i = 0; i < N; i++) {
ans = max(ans, sum - a[i].s);
sum += a[i].w;
}
printf("%d\n", ans);
}