题目描述
某条街被划为 n 条路段,这 n 条路段依次编号1…n。每个路段最多可以种一棵树。现在居民们给出了 ℎh 组建议,每组建议包含三个整数 b,e,t,表示居民希望在路段 b 到 e 之间至少要种 t 棵树。这些建议所给路段的区间可以交叉。请问:如果要满足所有居民的建议,至少要种多少棵树。
输入格式
第一行为 n,表示路段数。
第二行为 h,表示建议数。
下面 h 行描述一条建议:b,e,t,用一个空格分隔。
输出格式
输出只有一个数,为满足所有居民的建议,所需要种树的最少数量。
样例
9
4
1 4 2
4 6 2
8 9 2
3 5 2
5
右端点从小排序,右端点更多被利用
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int N = 3 * 10000 + 100;
class line {
public: int l;
int r;
int cnt;
};
int tree[N];//是否种了树
bool cmp(line a, line b) {
if (a.r != b.r) {
return a.r < b.r;
}
else if (a.l != b.l) {
return a.l > b.l;
};
};
int main() {
line* a = new line[5010];
int n,k;
cin >> n;
cin >> k;
for (int i = 1; i <= k; i++) {
cin >> a[i].l >> a[i].r >> a[i].cnt;
};
int nums = 0;//统计区间树的数量
int res = 0;
sort(a + 1, a + k + 1, cmp);
for (int i = 1; i <= k; i++){
nums = 0;
int l = a[i].l, r = a[i].r;
for (int j = l; j <= r; j++) {
if (tree[j] > 0) {
nums++;
};
};
if (nums < a[i].cnt) {//如果小于建议的数量
for (int j = r; r >= l; j--) {
if (tree[j] == 0) {
tree[j] = 1;
nums++;
if (nums >=a[i].cnt) break;
};
};
};
};
for (int i = 1; i <= n; i++) {
if (tree[i] > 0) {
res++;
};
};
//for (int i = 1; i <= n; i++) cout << tree[i] << " ";
cout << res << endl;
return 0;
};
ac了