题目链接

 

题意:

n个树,在x1,x2,。。。,xn的位置,树的高度依次是h1,h2,。。。,hn

求的是当把树砍倒时候,不占用相邻树的位置,最大砍树个数

 

可向左 向右砍,即树向左向右倒,很显然 当树的棵树大于1的时候,一定至少可以砍倒两棵树,位于最左和最右的两棵树可以直接砍倒

 

可以先考虑左砍树,再考虑右砍树

满足左砍树时候,不用考虑右砍树。

对xi 和 hi

 

左砍树 树最左可到  xi – hi

当 xi – hi> x[i-1] 时候左砍成立  x[i-1] 更新到x[i]

右砍树 树最右可到 x[i] + h[i]

当  x[i] + h[i] < x[i+1] 时候右砍成立  x[i] 更新到 x[i] + h[i]

 

Java程序

import java.util.Scanner;


public class C545 {
    static void run(){
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int[] x= new int[n];
        int[] h=new int [n];
        for(int i=0;i<n;i++){
            x[i]=sc.nextInt();
            h[i]=sc.nextInt();
        }
        int count = 2;
        if(n==1){
                System.out.println(1);
                return;
            }
        for(int i=1;i<n-1;i++){
            int left = x[i] - h[i];
            int right = x[i] + h[i];
            if(left>x[i-1] || right<x[i+1]) count ++;
            if(left>x[i-1]) x[i-1] = x[i];
            else if(right< x[i+1]) x[i] = right;
        }
        System.out.println(count);
    }
    public static void main(String[] args){
        run();
    }
}

 

Python程序

def C545():
    n = input()
    w = [map(int,raw_input().split()) for _ in xrange(n)]
    ans = 2
    if n <= 2:
        print n
        exit(0)
    for i in xrange(1,n-1):
        x,h = w[i] 
        if x - h > w[i-1][0]:
            ans += 1
        elif x + h < w[i+1][0]:
            w[i][0] += w[i][1]
            ans += 1
    print ans    
    
if __name__=='__main__':
    C545()