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