http://codeforces.com/problemset/problem/545/C Woodcutters

别的不管,能砍则砍。你问为啥这样可以搞到最优解???
可以这样考虑,一开始第一个位置的树肯定往左砍,接下来考虑第二棵树,往左砍的话需要判断是否会不合法,如果合法往左砍当然好咯,否则的话,看往右砍行不行,如果行则砍下去,你说不砍行不行??如果不砍肯定不能达到最优解咯,因为不砍,它右边那棵树有可能砍不掉或者往右砍影响到更右边的树能不能砍,所以说,我宁愿把这棵树先砍了,它右边的树能不能砍另外考虑。其实也可以这么想,我砍掉这棵树,和去砍掉右边那棵树的意义其实是相同的,而且我因为砍掉这棵树而导致后面那棵树不能砍其实更好,为什么呢,因为我后面那棵树不砍的话,在它之后的树相对而言更可能被砍掉。

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define PI (M_PI)
#define INF (0x3f3f3f3f)
#define MOD (1000000007)
#define EPS (1e-12)
#define MAX (1000000)
#define LEN (MAX+5)
struct tree{
    int x,h;
}a[100005];
int main()
{
    int n;
    cin >> n;
    for(int i = 1;i <= n;++i){
        scanf("%d%d",&a[i].x,&a[i].h);
    }
    int l = 1,s = -INF,c = 0;
    while(l < n){
        if(a[l].x - a[l].h > s) c++,s = a[l].x;
        else if(a[l].x + a[l].h < a[l + 1].x) c++,s = a[l].x + a[l].h;
        else s = a[l].x;
        l++;
    }
    cout << c + 1 << endl;
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值