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 <
推荐阅读
- 我曾经以为
- Jsr303做前端数据校验
- 名校和普校到底有什么不同()
- 《声之形》
- 驾校小白的“日常”
- 学校门口
- 愿我们相逢在春天的校园
- 我们的朝花夕拾(肆)
- “寓教于乐,丰知润德”——沭东实验学校临沂龙园研学旅行企划书
- 谭木匠连续举办三届木艺展|谭木匠连续举办三届木艺展 中外大师作品走进南艺校园