链接:
https://codeforces.com/problemset/problem/545/C
题意:
一个数轴上有n棵树,每棵树都有一个高度h,可以向右砍倒(占用[x,x+h]),或者向左砍倒(占用[x-h,x]),或者不砍
要求没有重叠点情况下,能砍的最大数量
解:
能向左砍就不会影响下一棵树的距离
向右砍会有影响,但是只会影响下一棵树的左砍,二选一,所以直接贪一手,能砍就砍
DP写起来麻烦,思路也差不多,放了
实际代码:
#include<iostream>
#include<bits/stdc++.h>
#define csh(a) memset(a,0,sizeof(a))
using namespace std;
typedef long long int ll;
typedef long double ld;
const int Size=1E5+5;
struct Node
{
int wz,num;
}sz[Size];
int wz=INT_MIN,ans=0;
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>sz[i].wz>>sz[i].num;
}
sz[n+1].wz=INT_MAX;
for(int i=1;i<=n;i++)
{
if((sz[i].wz-sz[i].num)>wz)
{
wz=sz[i].wz;
ans++;
}
else if((sz[i].wz+sz[i].num)<sz[i+1].wz)
{
wz=sz[i].wz+sz[i].num;
ans++;
}
else wz=sz[i].wz;
}
cout<<ans<<endl;
}
限制:
time limit per test
1 second
memory limit per test
256 megabytes
input
standard input
output
standard output