问题描述 :
明明是一家地铁建设公司的职员,他负责地铁线路的规划和设计。一次,明明要在一条长L的马路上建造若干个地铁车站。
这条马路有一个特点,马路上种了一排树,每两棵相邻的树之间的间隔都是一米。
如果把马路看成一个数轴,马路的一端在数轴0的位置,马路的另一端在L的位置,那么这些树都种在数轴的整数点上,即0,1,2,…,L上都种有一棵树。
由于要设计建造地铁站的缘故,所以需要把一些树移走,明明为了移树的方便,把地铁站的区域也建在了数轴上两个整数点之间,由于有多条地铁线路,地铁车站的区域可能会有部分的重合(重合的区域明明将来会设计成一个大型的车站,移树的时候不必考虑地铁站重合区域的问题)。
现在明明想请你帮一个忙,他把车站区域的位置告诉你,即告诉你数轴上的两个整数点,在这两个整数点之间是车站的区域,请你写一个程序,计算出把所有车站区域两点之间的树移走以后,这条马路上还剩多少棵树。
例如:马路长为10,要建造2个地铁车站,车站的区域分别是2到5和3到6,原先的马路上一共有11棵树,在2到5的位置上建车站后,需要移走4棵树,在3到6的位置上建车站后,也需要移走4棵树,但是3到6这个区域和2到5这个区域有部分重合,所以只需移走1棵树即可,这样总共移走的树是5棵,剩下的树就是6棵。
明明的问题可以归结为:给你一条马路的长度和若干个车站的位置,请你用程序计算出把树移走后,马路上还剩多少棵树。
输入说明 :
你写的程序要求从标准输入设备中读入测试数据作为你所写程序的输入数据。标准输入设备中有多组测试数据,每组测试数据有多行,每组测试数据的第一行有两个整数L(1≤L≤10000)和M(0≤M≤100),分别表示马路的长度和地铁车站区域的个数。接下来有M行,每行有2个整数,分别表示每一座地铁车站区域的两个坐标的。每组测试数据与其后一组测试数据之间没有任何空行,第一组测试数据前面以及最后一组测试数据后面也都没有任何空行。
输出说明 :
对于每一组测试数据,你写的程序要求计算出一组相应的运算结果,并将每组运算结果作为你所写程序的输出数据依次写入到标准输出设备中。每组运算结果为一个整数,即把树移走后,马路上还剩下多少棵树。每组运算结果单独占一行,其行首和行尾都没有任何空格或其他任何字符,每组运算结果与其后一组运算结果之间没有任何空行或其他任何字符,第一组运算结果前面以及最后一组运算结果后面也都没有任何空行或其他任何字符。 注:通常,显示屏为标准输出设备。
输入范例 :
5 1
1 2
10 2
2 5
3 6
输出范例 :
4
6
#include<stdio.h>
#define MAX_SIZE 101
// 车站起始点的坐标
typedef struct staPoint {
int start;
int end;
} staPoint;
void sort(staPoint points[], int n);
// 排序函数
void sort(staPoint points[], int n) {
int i = 0, j = 0;
staPoint temp;
for (i = n - 1; i >= 0; i--) {
for (j = 0; j < i; j++) {
if (points[j].start > points[j + 1].start) {
temp = points[j];
points[j] = points[j + 1];
points[j + 1] = temp;
}
}
}
}
int main() {
int L = 0, M = 0;
int i = 0, j = 0, k = 0;
int movedTrees = 0;// 被移走的树
staPoint points[MAX_SIZE];
scanf("%d%d", &L, &M);
for (i = 0; i < M; i++) {
scanf("%d%d", &points[i].start, &points[i].end);
}
sort(points, M);// 排序,保证某一个区域在下一个区域之前
// 将某个区域中覆盖的其他区域都删掉(如果存在的话)
for (i = 0; i < M - 1; i++) {
for (j = i + 1; j < M; ) {
if ((points[i].start <= points[j].start) &&
(points[i].end >= points[j].end)) {
for (k = j; k < M - 1; k++) {
points[k] = points[k + 1];
}
M--;
}
else {
j++;
}
}
}
for (i = 0; i < M; i++) {
movedTrees += (points[i].end - points[i].start + 1);
}
for (i = 0; i < M - 1; i++) {
if (points[i].end >= points[i + 1].start) {// 前后两区域有重合
movedTrees -= (points[i].end - points[i + 1].start + 1);
}
}
printf("%d\n", L - movedTrees + 1);
return 0;
}