codeforces 545 C. Woodcutters

在这里插入图片描述
题意:n棵树,可以砍或不砍,可以倒向左或右;问最多可以砍多少棵树;
dp:表示第i棵树所占据的最右边的位置。
从左向右循环,不断更新dp值。

#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<iostream>
#include<map>
#include<cmath>
#define ll long long 
using namespace std;
ll h[100100];
ll dp[100100];
int main()
{

		int n;
		scanf("%d",&n);
		for(int i=1;i<=n;i++)
		{
			scanf("%I64d%I64d",&dp[i],&h[i]);

		}
		 ll cnt=1;
		 for(int i=2;i<n;i++)
		 {
			 if(dp[i]-h[i]>dp[i-1])	//想左倒 dp值不变
			 {
				 cnt++;
			 }
			 else if(dp[i]+h[i]<dp[i+1])//向右倒,dp值改变
			 {
				 cnt++;
				 dp[i]=dp[i]+h[i];
			 }
			 
		 }
		 if(n>1)			//如果n>1那么两边的两个分别向两边倒(必有两个)
		 cout<<cnt+1<<endl;
		 else
			 cout<<cnt<<endl;
	
	return 0;
}
posted @ 2020-07-10 18:07  DuJunlong  阅读(8)  评论(0编辑  收藏  举报  来源