首页 > 试题广场 >

校门外的树

[编程题]校门外的树
  • 热度指数:1917 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
\hspace{15pt}某校大门外长度为 L 的马路上有一排树,每两棵相邻的树之间的间隔都是 1 米。我们可以把马路看成一个数轴,马路的一端在数轴 0 的位置,另一端在 L 的位置;数轴上的每个整数点,即 0,1,2,\dots,L,都种有一棵树。

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

输入描述:
\hspace{15pt}第一行输入两个整数 L,M,用空格隔开,表示马路的长度和地铁施工区域数,满足 1 \leqq L \leqq 100001 \leqq M \leqq 100

\hspace{15pt}接下来 M 行,每行输入两个整数 l_i,r_i,用空格隔开,表示第 i 个施工区域的起始点和终止点的坐标,满足 0 \leqq l_i \leqq r_i \leqq L


输出描述:
\hspace{15pt}输出一个整数,表示移除所有施工区域内(包括端点)树后,剩余的树的总棵树数。
示例1

输入

500 3
150 300
100 200
470 471

输出

298

说明

马路上共有 L+1=501 棵树。施工区域 [150,300] 中含有 151 棵,[100,200] 中含有 101 棵,[470,471] 中含有 2 棵。三个区域的重叠部分 [150,200] 有 51 棵被重复移除,所以实际移除的树数为 151+101+2-51=203,因此剩余 501-203=298 棵。
示例2

输入

10 2
2 5
4 8

输出

4

说明

马路上共有 11 棵树。区域 [2,5] 移除 4 棵,区域 [4,8] 移除 5 棵。重叠部分 [4,5] 有 2 棵被重复移除,所以实际移除 4+5-2=7 棵,剩余 11-7=4 棵。

备注:

用set
l, m = map(int, input().split())
s = set()
for i in range(m):
    a, b = map(int, input().split())
    s.update(range(a, b+1))
print(l + 1 - len(s))

发表于 2025-06-18 11:36:36 回复(0)
l,m = map(int,input().strip().split())

regin = []
for _ in range(m):
    a,b = map(int,input().strip().split())
    regin.append((a,b))

totals = l +1
remove_trees = overlaps = 0

removed = [False] * (l+1)

for (a,b) in regin:
    for i in range(a,b+1):
        if not removed[i]:
            remove_trees += 1
            removed[i] = True
        else:
            overlaps += 1

remain = totals - remove_trees
print(remain)

发表于 2025-06-07 21:42:21 回复(1)
import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        while (in.hasNextInt()) { // 注意 while 处理多个 case
            int L = in.nextInt();
            int M = in.nextInt();
            int[] Trees = new int[L + 1];//设置树组
            int count = 0;
            for(int i = 0;i < M;i++){//循环次数
                int start = in.nextInt();
                int end = in.nextInt();
                for(int j = start;j <= end;j++){//遍历区间,若未重复则置值为1,计数++
                    if(Trees[j] == 0){
                        Trees[j] = 1;
                        count++;
                    }
                }
            }
            System.out.println(Trees.length - count);
        }
    }
}
发表于 2025-07-08 11:51:35 回复(0)
L, M = map(int, input().split())

trees = [1] * (L + 1)

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

print(sum(trees))


发表于 2025-07-07 15:38:40 回复(0)
n,M=map(int,input().split())
L=[1]*(n+1)
for _ in range(M):
    l,r=map(int,input().split())
    for i in range(l,r+1):
        L[i]=0
print(sum(L))
发表于 2025-06-24 16:16:05 回复(0)
L, M = map(int, input().split())
S = []
for i in range(M):
    temp = list(map(int, input().split()))
    S.append(temp)

S.sort(key=lambda x: x[0])
# print(S)
L = L+1
for i in range(M):
    if i==0:
        L = L-(S[i][1]-S[i][0]+1)
    else:
        if S[i][0]<=S[i-1][1]:
            if S[i][1]<S[i-1][1]:
                S[i][1] = S[i-1][1]
            else:
                L = L - (S[i][1]-S[i-1][1])
        else:
            L = L-(S[i][1]-S[i][0]+1)
print(L)
发表于 2025-06-18 01:35:36 回复(0)
l,m = map(int,input().split())
l1 = list(range(l+1))
exclude = set()
for i in range(m):
    m1,m2 = map(int,input().split())
    exclude.update(range(m1, m2 + 1))
l1 = [x for x in l1 if x not in exclude]
print(len(l1))
感觉用去重简单点
发表于 2025-06-04 13:33:01 回复(0)
示例答案错了
发表于 2025-05-22 17:36:41 回复(0)