「一本通 1.1 例 2」种树
解题思路
这题的题目问的是要满足所有居民的建议,至少要种多少棵树。 对于这种题目,我们首先想到的应该是贪心策略。
贪心策略:
首先按右端点从小到大排序,因为要求树最少,所以要尽量放在右端点。然后定义一个bool数组判断该点是否种过树即可。
从右端点开始种,可以让更多的树照顾到更右侧的端点,这样就能使种的数最少了。
#include <bits/stdc++.h>
using namespace std;
const int maxn = 3e4 + 5;
typedef long long ll;
struct Node {
int l, r, w;
};
Node arr[maxn];
bool visited[maxn];
inline bool cmp (Node a, Node b)
{
return a.r < b.r;
}
int main()
{
int n, m, ans = 0;
cin >> n >> m;
for(int i = 0; i < m; ++i) cin >> arr[i].l >> arr[i].r >> arr[i].w;
sort(arr, arr + m, cmp);
for(int i = 0; i < m; ++i) {
int k = 0;
for(int j = arr[i].l; j <= arr[i].r; ++j)
if(visited[j]) k++;
if(k >= arr[i].w) continue;
for(int j = arr[i].r; j >= arr[i].l; --j) {
if(!visited[j]) {
visited[j] = true;
ans++;
k++;
if(k == arr[i].w) break;
}
}
}
cout << ans << endl;
return 0;
}