有趣的贪心思路
2026-04-29 19:09:38
发布于:北京
2阅读
0回复
0点赞
贪心策略就是尽可能往同一个方向倒,无法倒的情况下,再往另一个方向倒,另外一个方向也倒不了的情况下,则不倒。
假定尽量往前倒,第一棵树一定可以倒,更新 可以倒的边界(end)为第一棵树的坐标。
从第二棵树开始直到倒数第二棵树,先考虑让其往前倒,如果倒下去的区间左边界大于可以倒的边界(end),则让其往前倒,更新可以倒的边界(end)为当前树的坐标;否则考虑让其往后倒,如果倒下去的区间右边界小于下一棵树的坐标,则让其往后倒,更新可以倒的边界(end)为倒下去的区间右边界坐标;否则不倒,更新可以倒的边界(end)为当前树的坐标。
考虑最后一棵树 直接往后倒,计数加1即可。
#include<bits/stdc++.h>
using namespace std;
struct node {
int x, h;
} arr[100005];
int main() {
int n;
cin>>n;
for(int i = 0; i<n; i++) {
cin>>arr[i].x>>arr[i].h;
}
int cnt=1, end=arr[0].x; //第一棵树往前倒
for(int i = 1; i<n-1; i++) {
if(arr[i].x-arr[i].h>end){ //可以往前倒
cnt++;
end=arr[i].x;
}else if(arr[i].x+arr[i].h<arr[i+1].x){ //可以往后倒
cnt++;
end=arr[i].x+arr[i].h;
}else end=arr[i].x; //不倒
}
cout<<cnt+1; //最后一棵树,一定可以往后倒
return 0;
}
这里空空如也

有帮助,赞一个