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]代表砍了向右倒。
题目大意:
给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; }
相关文章推荐
- SpiralOrderTraverse,螺旋遍历二叉树,利用两个栈
- BBC-unit7 session1
- 字符串分割,以及字符串匹配
- Visual Studio属性配置中使用宏
- out.println()和<%=%>那种输出方式更好?
- okHttp post&get请求
- Javassist library is missing in classpath! Please add missed dependency!
- android 实现截取 内容超过屏幕大小的长图
- windows7系统上查找大于指定大小的文件
- css position属性
- Linux系统安装 OpenSSL两种方法
- 列式存储和行式存储的区别
- Quartz教程五:SimpleTrigger
- python docx库使用样例
- 5528Count a b
- 组合数的一些性质
- 线上MySQL备份脚本
- org/apache/hadoop/hbase/CompatibilityFactory(scan)没有找到类的解决办法
- 下拉选择菜单封装
- 网络库研究路径