您的位置:首页 > 其它

Codeforces 545C Woodcutters

2016-06-28 20:52 495 查看
http://codeforces.com/contest/545/problem/C

题目大意:

给n棵树的在一维数轴上的坐标,以及它们的高度。现在要你砍倒这些树,树可以向左倒也可以向右倒,砍倒的树不能重合、当然也不能覆盖其他的树原来的位置,现在求最大可以砍倒的树的数目

思路:从左往右dp,f[i][0]代表i不砍,f[i][1]代表砍了往左倒,f[i][2]代表砍了向右倒。

#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<iostream>
#define ll long long
ll a[200005],h[200005];
int f[200005][3],n;
int read(){
int t=0,f=1;char ch=getchar();
while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
while ('0'<=ch&&ch<='9'){t=t*10+ch-'0';ch=getchar();}
return t*f;
}
int main(){
n=read();
for (int i=1;i<=n;i++) a[i]=read(),h[i]=read();
a[0]=-99999999999LL;
for (int i=1;i<=n;i++){
f[i][0]=std::max(f[i-1][0],f[i-1][1]);
if (a[i-1]+h[i-1]<a[i]) f[i][0]=std::max(f[i][0],f[i-1][2]);

if (a[i]-h[i]>a[i-1])
f[i][1]=std::max(f[i-1][0],f[i-1][1])+1;
if (a[i]-h[i]>a[i-1]+h[i-1])
f[i][1]=std::max(f[i][1],f[i-1][2]+1);

f[i][2]=std::max(f[i-1][0],f[i-1][1])+1;
if (a[i-1]+h[i-1]<a[i])
f[i][2]=std::max(f[i][2],f[i-1][2]+1);
}
int ans=std::max(f
[0],std::max(f
[1],f
[2]));
printf("%d\n",ans);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: