一、题目链接
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 {
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;
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];
}
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;
}