标签:nod 接下来 img class com tor 两种 lap can
【题目描述】
(求区间叠加最大数)有 n 头牛,每头牛有个喝水时间,这段时间它将 . 独 . 占一个 Stall。现在给出每头牛 的喝水时间段,问至少要多少个 Stall 才能满足它们的要求。
【输入格式】
第一行一个正整数 n。 接下来 n 行每行两个正整数 a,b,表示每头牛的喝水时间段
对于 100% 的数据,1≤n≤50000, 1≤ a ≤ b ≤106
【题解】
以下两种代码的思路是一样的,只是实现方式不同,第一种更加简洁吧(大概 )。
①注意:排序时,对于值相同的点,右端点排在前面。
#include <cstdio> #include <algorithm> const int MAXN = 1e7 + 7; int n, cnt = 1, ans, maxn; struct Node { int value, pos; bool operator < (Node c) { if (value != c.value) return value < c.value; else return pos < c.pos; } } node[MAXN]; int main() { freopen("a.in", "r", stdin); freopen("a.out", "w", stdout); scanf("%d", &n); for (int i = 1; i <= n; i++) { scanf("%d%d", &node[cnt].value, &node[cnt + 1].value); node[cnt + 1].value++; // 将它延后一个是为了避免无法解决 |___|___| node[cnt].pos = 1, node[cnt + 1].pos = -1; // 【接上一行】(前一个区间的右端点与后一个的左端点重合)的情况 cnt += 2; } std::sort(node + 1, node + 2 * n + 1); // for (int i = 1; i <= 2 * n; i++) { // printf("%d: %d %d\n", i, node[i].pos, node[i].value); // } for (int i = 1; i <= 2 * n; i++) { ans += node[i].pos; if (maxn < ans) maxn = ans; } printf("%d\n", maxn); return 0; }
②
#include <cstdio> const int MAXN = 1e7 + 7; int n, a[MAXN], maxn, ans, re, x, y; int main() { freopen("a.in", "r", stdin); freopen("a.out", "w", stdout); scanf("%d", &n); for (int i = 1; i <= n; i++) { scanf("%d%d", &x, &y); if (y > maxn) maxn = y; a[x]++; a[y + 1]--; } for (int i = 1; i <= maxn + 1; i++) { re += a[i]; if (re > ans) ans = re; } printf("%d\n", ans); return 0; }
【2017.10.28】noip赛前集训 | T1 【差分】
标签:nod 接下来 img class com tor 两种 lap can
原文地址:http://www.cnblogs.com/ExileValley/p/7747834.html