E - Woodcutters(贪心,动态)

小苏西每天睡前听童话故事。今天的童话故事是关于伐木工人的,小女孩立刻开始想象伐木工人在伐木。她想象了下面描述的情况。 道路沿线坐标x1,x2,…,xn处有N棵树。每棵树都有它的高度。伐木工人可以砍倒一棵树,然后把它倒在左边或右边。之后,它占据了一个部分 [xi - hi, xi] or [xi;xi + hi]. 。未被砍伐的树与坐标Xi占据单个点。如果要被倒下的树占用的部分不包含任何占用点,伐木工人可以倒下一棵树。樵夫们想尽可能多地种树,所以苏茜想知道,砍伐树木的最大数量是多少。
Input
The first line contains integer n (1 ≤ n ≤ 105) — the number of trees.
Next n lines contain pairs of integers xi, hi (1 ≤ xi, hi ≤ 109) — the coordinate and the height of the і-th tree.
The pairs are given in the order of ascending xi. No two trees are located at the point with the same coordinate.
Output
Print a single number — the maximum number of trees that you can cut down by the given rules.
Examples
Input
5
1 2
2 1
5 10
10 9
19 1
Output
3
Input
5
1 2
2 1
5 10
10 9
20 1
Output
4
Note
In the first sample you can fell the trees like that:
fell the 1-st tree to the left — now it occupies segment [ - 1;1]
fell the 2-nd tree to the right — now it occupies segment [2;3]
leave the 3-rd tree — it occupies point 5
leave the 4-th tree — it occupies point 10
fell the 5-th tree to the right — now it occupies segment [19;20]
In the second sample you can also fell 4-th tree to the right, after that it will occupy segment [10;19].
从左往右,先往左倒,不行往右

#include<cstdio>
#include<cstring>
#include<string>
#include<queue>
#include<iostream>
#include<algorithm>
using namespace std;
struct node{
 long long a,b;//a左边,b高度
}q[170100];
int main()
{
	int n,ans=0;
	cin>>n;
	for(int i=1;i<=n;i++)
	 cin>>q[i].a>>q[i].b;
	q[0].a=-0x3f3f3f3f3f;q[n+1].a=0x3f3f3f3f3f;
	for(int i=1;i<=n;i++)
	{
	 if(q[i].a-q[i].b>q[i-1].a)
	 {
	  ans++;continue;	
	 }
	 if(q[i].a+q[i].b<q[i+1].a)
	 {
	  q[i].a+=q[i].b;
	  ans++;
	 }	
	}
	cout<<ans;
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值