P1047校门外的树 C++全解

某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米。我们可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在L的位置;数轴上的每个整数点,即0,1,2,……,L,都种有一棵树。
由于马路上有一些区域要用来建地铁。这些区域用它们在数轴上的起始点和终止点表示。已知任一区域的起始点和终止点的坐标都是整数,区域之间可能有重合的部分。现在要把这些区域中的树(包括区域端点处的两棵树)移走。你的任务是计算将这些树都移走后,马路上还有多少棵树。
输入描述:

第一行有两个整数:L(1 <= L <= 10000)和 M(1 <= M <= 100),L代表马路的长度,M代表区域的数目,L和M之间用一个空格隔开。接下来的M行每行包含两个不同的整数,用一个空格隔开,表示一个区域的起始点和终止点的坐标。
输入:
500 3
150 300
100 200
470 471
输出:
【P1047校门外的树 C++全解】298
//解法一:简单无脑解法 #include #include #include #includeusing namespace std; const int N = 10010; int L ,n; bool tree[N]; int main(){ cin >> L >> n; while (n --) { int l, r; cin >> l >> r; for (int i = l ; i <= r; i++) tree[i] = true; } int res = 0; for (int i = 0; i <= L; i++) if (!tree[i]) res ++; cout << res << endl; }

//解法二:对于这题当数据的范围比较的大的时候,使用区间合并. #include #include #include #include#define x first #define y secondusing namespace std; typedef pair PII; const int N = 110; int L, n; PII seg[N]; int main() {//解法二:区间合并 cin >> L >> n; for (int i = 0; i < n; i++) scanf("%d%d", &seg[i].x, &seg[i].y); sort(seg, seg + n); //pair自带一个比较函数,先按照第一关键字排数, //第一关键子相等的时候,用第二关键字进行排序. int st = seg[0].x, ed = seg[0].y; int sum = 0; for (int i = 1; i < n ; i ++) if (seg[i].x> ed) { sum += ed -st + 1; st = seg[i].x, ed = seg[i].y; } else ed = max(ed, seg[i].y); sum += ed - st+ 1; //最后一个区间是没有加上的. cout <

    推荐阅读