题库练习——校门外的树


*

[NOIP2005 普及组] 校门外的树

题目描述

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

输入格式

第一行有两个整数,
分别表示马路的长度 L 和区域的数目 m。
接下来 m 行,每行两个整数 u, v
,表示一个区域的起始点和终止点的坐标。

输出格式

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

样例 #1

样例输入 #1

500 3
150 300
100 200
470 471

样例输出 #1

298

提示

【数据范围】

  • 对于 $20\ % $ 的数据,保证区域之间没有重合的部分。

    • 对于 $100\ % $ 的数据,保证 $1 \leq l \leq 10 ^ 4$,$1 \leq m \leq 100$,$0 \leq u \leq v \leq l$。
      【题目来源】
      NOIP 2005 普及组第二题*/

        #include <stdio.h>
        int main() {
        int L;
        int road = L;
        int m;
        int space;
        scanf("%d %d", &L, &m);
        int arr[m * 2 - 1];
        for (int i = 1; i <= m; i++) {
        scanf("\n%d %d", &arr[i * 2 - 1],&arr[i * 2]);
        arr[i * 2 - 1] < space < arr[i * 2];//写到这写不下去了,不知道怎么将范围求并集;
            }
        return 0;
        }

    查询题解,使用了一种标记访问法;
    这道题把数组和for循环、if选择语句结合;

      #include <stdio.h>
    
      int main() {
      int a[2];
      int b[10001];
      int L = 0;
      int m = 0;
      int sum = 0;
      scanf("%d %d", &L, &m);
      for (int i = 0; i <= L; i++) {
      b[i] = 1;//先对所有树进行访问初始化为1;
      }
      for (int i = 1; i <= m; i++) {
      for (int j = 0; j < 2; j++) {
          scanf("%d", &a[j]);
      }//每行两个数,所以循环两次,将两个数存储在数组中,方便下面进行范围判断
      for (int j = 0; j <= L; j++) {
          if (j >= a[0] && j <= a[1])
              b[j] = 0;
      }//if语句判断是否在这两数间的范围
    
      }//外部for循环是循环m行
      for (int i = 0; i <= L; i++) {
      if (b[i] == 1)
          sum++;
      }//最后再一次对全部树进行访问,统计结果
      printf("%d", sum);
      return 0;
      }
    
标准题解:
#include <stdio.h>

int main() {
int i, j, L, a[2], b[10001], M, count = 0;
scanf("%d%d", &L, &M);
for (i = 0; i <= L; i++)
    b[i] = 0;
for (i = 1; i <= M; i++) {
    for (j = 0; j < 2; j++)
        scanf("%d", &a[j]);
    for (j = 0; j <= L; j++)
        if (j >= a[0] && j <= a[1])
            b[j] = 1;
}
for (i = 0; i <= L; i++)
    if (b[i] == 0)
        count++;
printf("%d", count);
return 0;
}

声明:Logic & Superegos ' House|版权所有,违者必究|如未注明,均为原创|本网站采用BY-NC-SA协议进行授权

转载:转载请注明原文链接 - 题库练习——校门外的树


Be water,my friend.