OpenJudge-1.6.06:校门外的树

一、题目链接

http://noi.openjudge.cn/ch0106/06/

二、解题思路(Java)

◎ 通过int类型的数组trees[L + 1]标记长度为L的马路上所有树的状态:
	→ trees[i]为1代表位置i上有一棵树,0 <= i <= L;
	→ trees[i]为0代表位置i上没有树,0 <= i <= L;
◎ 通过两个int类型的数组start[M]、end[M]存储M个地铁站的起始坐标和终止坐标:
	→ 对于第i个地铁站,start[i]和end[i]之间的树均需要被移除,也即令trees[start[i]]到trees[end[i]]之间的值为0,0 <= i < M;
◎ 方法public int treesRemained(int L, int[] start, int[] end)处理所有业务逻辑:
	→ 参数L为int类型的整数,代表马路长度;
	→ 参数start为int类型的数组,存储每个地铁站的起始坐标;
	→ 参数end为int类型的数组,存储每个地铁站的终止坐标;
	→ treesRemained方法返回非负整数,代表地铁修建完毕后马路上剩余的树的数目;
◎ 定义int类型的整数M,代表地铁站的数量,令M = start.length;
◎ 定义int类型的整数ans,代表地铁修建完毕后马路上剩余的树的数目,初始时ans为0;
◎ 定义int类型的数组trees[L + 1],标记长度为L的马路上所有树的状态;
◎ 利用循环i将数组trees中的所有元素置为1,也即初始时每隔一米有一棵树;
◎ 从第一个地铁站开始,到最后一个地铁站为止,利用循环i处理如下:
	→ 从start[i]开始,到end[i]为止,利用循环j处理如下:
		*** 令trees[j] = 0,也即移除start[i]到end[i]之间的树;
		循环j结束后,第i个地铁站起始坐标至终止坐标之间的树均被移除;
	循环i结束后,数组trees的元素之和代表地铁修建完毕后马路上剩余的树的数目;
◎ 从马路第一个位置开始,到马路最后一个位置为止,利用循环i处理如下:
	→ 令ans = trees[i] + ans,也即对数组trees的元素累加求和:
	循环i结束后,ans中存储了地铁修建完毕后马路上剩余的树的数目,返回ans;
◎ 在main方法中调用treesRemained方法,注入相应的参数后即可获得计算结果。

三、解题思路(C++)

◎ 通过int类型的数组trees[L + 1]标记长度为L的马路上所有树的状态:
	→ trees[i]为1代表位置i上有一棵树,0 <= i <= L;
	→ trees[i]为0代表位置i上没有树,0 <= i <= L;
◎ 通过两个int类型的数组start[M]、end[M]存储M个地铁站的起始坐标和终止坐标:
	→ 对于第i个地铁站,start[i]和end[i]之间的树均需要被移除,也即令trees[start[i]]到trees[end[i]]之间的值为0,0 <= i < M;
◎ 定义并输入两个int类型的整数L、M,分别代表马路长度、地铁站的数量;
◎ 定义三个int类型的数组trees[L + 1]、start[M]、end[M],分别用于标记长度为L的马路上所有树的状态、存储M个地铁站的起始坐标、存
储M个地铁站的终止坐标;
◎ 定义三个int类型的整数ans、i、j,分别代表地铁修建完毕后马路上剩余的树的数目和两个循环变量,初始时ans为0;
◎ 利用循环i输入start数组和end数组各自的元素;
◎ 利用循环i将数组trees中的所有元素置为1,也即初始时每隔一米有一棵树;
◎ 从第一个地铁站开始,到最后一个地铁站为止,利用循环i处理如下:
	→ 从start[i]开始,到end[i]为止,利用循环j处理如下:
		*** 令trees[j] = 0,也即移除start[i]到end[i]之间的树;
		循环j结束后,第i个地铁站起始坐标至终止坐标之间的树均被移除;
	循环i结束后,数组trees的元素之和代表地铁修建完毕后马路上剩余的树的数目;
◎ 从马路第一个位置开始,到马路最后一个位置为止,利用循环i处理如下:
	→ 令ans = trees[i] + ans,也即对数组trees的元素累加求和:
	循环i结束后,ans中存储了地铁修建完毕后马路上剩余的树的数目;
◎ 输出ans。

四、Java程序

import java.util.Scanner;

public class Main {
     /**
     * 返回地铁修建完毕后马路上剩余的树的数目
     *
     * @param L     int类型的整数,代表马路长度
     * @param start int类型的数组,存储每个地铁站的起始坐标
     * @param end   int类型的数组,存储每个地铁站的终止坐标
     * @return 非负整数,代表地铁修建完毕后马路上剩余的树的数目
     */
    public int treesRemained(int L, int[] start, int[] end) {
        int n = start.length; // 地铁站的数量
        int ans = 0; // 地铁修建完毕后马路上剩余的树的数目
        int[] trees = new int[L + 1]; // 标记每棵树的状态
        int i;
        int j;
        /* 初始时标记所有的树都未被移除,用1表示 */
        for (i = 0; i < L + 1; i++) {
            trees[i] = 1;
        }
        /* 从第一个地铁站开始,到最后一个地铁站为止 */
        for (i = 0; i < n; i++) {
            /* 将当前地铁站起始坐标到终止坐标区域内的树木移除 */
            for (j = start[i]; j <= end[i]; j++) {
                trees[j] = 0;
            }
        }
        /* 计算地铁修建完毕后马路上剩余的树的数目 */
        for (i = 0; i < L + 1; i++) {
            ans = trees[i] + ans;
        }
        return ans;
    }

    public static void main(String[] args) {
        Main test = new Main();
        Scanner input = new Scanner(System.in);
        int L = input.nextInt();
        int M = input.nextInt();
        int[] start = new int[M];
        int[] end = new int[M];
        for (int i = 0; i < M; i++) {
            start[i] = input.nextInt();
            end[i] = input.nextInt();
        }
        System.out.print(test.treesRemained(L, start, end));
    }
}

五、C++程序

#include <iostream>
using namespace std;

int main()
{
    int L; // 马路长度
    cin >> L;
    int M; // 地铁站的数量
    cin >> M;
    int trees[L + 1]; // 标记每棵树的状态
    int start[M]; // 存储每个地铁站的起始坐标
    int end[M]; // 存储每个地铁站的终止坐标    
    int ans = 0; // 地铁修建完毕后马路上剩余的树的数目
    int i;
    int j;
    /* 输入各地铁站的起始坐标和终止坐标 */
    for (i = 0; i < M; i++)
    {
        cin >> start[i];
        cin >> end[i];
    }
    /* 初始时标记所有的树都未被移除,用1表示 */
    for (i = 0; i <= L; i++)
    {
        trees[i] = 1;
    }
    /* 从第一个地铁站开始,到最后一个地铁站为止 */
    for (i = 0; i < M; i++)
    {
        /* 将当前地铁站起始坐标到终止坐标区域内的树木移除 */
        for (j = start[i]; j <= end[i]; j++)
        {
            trees[j] = 0;
        }
    }
    /* 计算地铁修建完毕后马路上剩余的树的数目 */
    for (i = 0; i < L + 1; i++)
    {
        ans = trees[i] + ans;
    }
    cout << ans;
    return 0;
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

江苏科技大学_计算机学院_潘磊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值