#include <stdio.h> #include <stdbool.h> struct vrb { int st, ed; }; bool cmp(struct vrb a, struct vrb b) { if (a.st == b.st) return a.ed < b.ed; return a.st < b.st; } int main() { int n, s, ends, sta, sum; struct vrb a[5001]; scanf("%d", &n); for (int i = 1; i <= n; ++i) scanf("%d%d", &a[i].st, &a[i].ed); // Sorting for (int i = 1; i <= n - 1; ++i) { for (int j = 1; j <= n - i; ++j) { if (cmp(a[j + 1], a[j])) { struct vrb temp = a[j]; a[j] = a[j + 1]; a[j + 1] = temp; } } } sta = a[1].st; ends = a[1].ed; s = ends - sta; for (int i = 2; i <= n; ++i) { if (a[i].st >= ends) { s += a[i].ed - a[i].st; ends = a[i].ed; sta = a[i].st; } else { if (a[i].ed - a[i].st > ends - sta) { s -= ends - sta; s += a[i].ed - a[i].st; ends = a[i].ed; sta = a[i].st; } else { sum = 0; for (int j = i - 1; j >= 1; --j) { if (a[j].ed <= a[i].st) sum += a[j].ed - a[j].st; if (a[j].st == sta && a[i].st >= a[j].ed && a[i].ed - a[i].st + sum > ends - sta) { s += a[i].ed - a[i].st + sum - ends + sta; ends = a[i].ed; sta = a[i].st; if (a[i].st == a[j].ed) sta = a[j].st; break; } if (a[j].st < sta) break; } } } } printf("%d", s); return 0; }sum的作用是什么
时间: 2024-04-26 07:24:58 浏览: 41
这段代码实现了一个计算区间覆盖长度的功能。具体来说,给定 n 个区间,每个区间用起点和终点表示,需要计算这些区间在数轴上覆盖的总长度。代码中使用结构体数组存储每个区间的起点和终点,然后对区间按照起点从小到大排序。接着,从第一个区间开始遍历每个区间,同时维护当前已经覆盖的区间的起点和终点,以及已经覆盖的总长度。如果当前区间与已经覆盖的区间没有重叠部分,那么直接加上当前区间的长度即可;如果有重叠部分,需要分情况讨论。如果当前区间的长度比已经覆盖的区间的长度更长,那么只需要加上多出来的长度即可。如果当前区间的长度比已经覆盖的区间的长度更短,那么需要向前查找之前的区间,找到与当前区间相交的最大的区间,然后计算出这些区间的总长度,再加上当前区间的长度,减去已经覆盖的区间的长度,就是当前区间覆盖的长度。最后输出计算出来的总长度即可。
阅读全文