C++题目 种树
题目描述:
小明家旁边新铺了一条马路,为了美化环境,居民想要在这条马路边种树。这条马路被划为 n n n 个路段,这 n n n 个路段依次编号为 1 1 1、 2 2 2、 . . . ... ... 、 n n n。每个路段最多可以种一棵树。现在居民们给出了 m m m 个建议,每个建议包含两个整数 s s s 和 e e e, 表示居民希望在路段 s s s 到 e e e 之间任意位置种一棵树。请问,如果要满足所有居民的建议,至少要种多少颗树。
【输入】
共
h
+
2
h+2
h+2行。
第一行包含一个整数
n
(
n
<
5000
)
n(n<5000)
n(n<5000),表示共有
n
n
n个路段。
第二行包含一个整数
m
(
m
<
100
)
m(m<100)
m(m<100),表示共有
m
m
m个建议。
接下来的
m
m
m行,每行包含两个整数
s
s
s和
e
(
1
<
=
s
,
e
<
=
n
)
e(1<=s,e<=n)
e(1<=s,e<=n),代表在坐标
s
s
s和
e
e
e之间必须要有一颗树。
【输出】
一个整数,表示最少种的树的数目。
【输入样例1】
5
3
1 3
2 4
4 5
【输出样例1】
2
【输入样例2】
9
4
1 4
4 6
3 5
7 9
【输出样例2】
2
题解
#include <iostream>
#include <algorithm>
using namespace std;
struct line
{
int s, e;
};
line a[5005];
int n,m,ans=0;
bool used[30005] = {0};
bool cmp(line a, line b)
{
return a.e < b.e;
}
int main()
{
cin>>n>>m;
for(int i=1;i<=m;i++)
cin >> a[i].s >> a[i].e;
sort(a+1,a+1+m,cmp);
for(int i=1;i<=m;i++)
{
int k=0;
for (int j = a[i].s; j <= a[i].e; j++)
{
if (used[j]){
k++;
}
}
if (k > 0)
{
continue;
}
else
{
used[a[i].e]=1;
ans++;
}
}
cout << ans;
return 0;
}