题意:
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()