[NOIP2005 普及组] 校门外的树

题目描述

某校大门外长度为 ll 的马路上有一排树,每两棵相邻的树之间的间隔都是 11 米。我们可以把马路看成一个数轴,马路的一端在数轴 00 的位置,另一端在 ll 的位置;数轴上的每个整数点,即 0,1,2,,l0,1,2,\dots,l,都种有一棵树。

由于马路上有一些区域要用来建地铁。这些区域用它们在数轴上的起始点和终止点表示。已知任一区域的起始点和终止点的坐标都是整数,区域之间可能有重合的部分。现在要把这些区域中的树(包括区域端点处的两棵树)移走。你的任务是计算将这些树都移走后,马路上还有多少棵树。

输入格式

第一行有两个整数,分别表示马路的长度 ll 和区域的数目 mm

接下来 mm 行,每行两个整数 u,vu, v,表示一个区域的起始点和终止点的坐标。

输出格式

输出一行一个整数,表示将这些树都移走后,马路上剩余的树木数量。

样例 #1

样例输入 #1

1
2
3
4
500 3
150 300
100 200
470 471

样例输出 #1

1
298

提示

【数据范围】

  • 对于 20%20\% 的数据,保证区域之间没有重合的部分。
  • 对于 100%100\% 的数据,保证 1l1041 \leq l \leq 10^41m1001 \leq m \leq 1000uvl0 \leq u \leq v \leq l

【题目来源】

NOIP 2005 普及组第二题

题解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
int_values = input().split()
int_values = list(map(int, int_values))
list1 = []
for i in range(int_values[0] + 1):
list1.append(1)


for i in range(int_values[1]):
a, b = map(int, input().split())
for j in range(a, b + 1):
list1[j] = 0

count = 0
for i in range(int_values[0] + 1):
if list1[i] == 1:
count += 1
print(count)

题解解释

  1. int_values = input().split(): 从标准输入中读取一行字符串,使用 split() 方法将其拆分为字符串列表,例如 ['500', '3']
  2. int_values = list(map(int, int_values)): 将字符串列表中的每个元素转换为整数,得到 [500, 3]
  3. list1 = []: 初始化一个空列表,该列表将表示整条道路上的树木分布。
  4. for i in range(int_values[0] + 1): list1.append(1): 使用循环,将长度为 l + 1 的列表初始化为 1,其中 l 是道路的长度。
  5. for i in range(int_values[1]): a, b = map(int, input().split()): 从输入中读取区域的起始点和终止点,并将其转换为整数。
  6. for j in range(a, b + 1): list1[j] = 0: 将区域内的树木移除,将相应的元素设置为 0。
  7. count = 0: 初始化一个计数器,用于计算剩余的树木数量。
  8. for i in range(int_values[0] + 1): if list1[i] == 1: count += 1: 遍历整个列表,统计值为 1 的元素的数量,即剩余的树木数量。
  9. print(count): 输出最终的树木数量。

另外要注意,0-l 是长度,但是要生成的列表大小是 l+1,因为包含 0,实际个数比长度多一个

知识点

list 初始化是空列表,需要 append 添加元素,不要用 list 来命名一个列表

a, b = map(int, input().split()) 可以用这种写法来实现多变量存储

list 计数的方法还有 list.count()