tags:
- 模拟
- 贪心
- 搜索
- 动态规划 categories:
- 信息学竞赛
- 总结
积木大赛
Solution
发现如果一段先单调上升然后在单调下降, 那么这一块的代价是最高的减去前面已经铺好的, 例如
6 5 6 7 8 9 8 7 6 5
需要先先铺6 5
代价是6
, 然后铺67898765
, 代价是9-5
.
根据这个这个就是记录一个已经铺好的最大值, 然后如果比已经铺好的大就加入答案并且更新已经铺好的.
Code
#include int main(){ int n,h,l,a; scanf("%d",&n); for(int i=0,l=a=0;i l)a+=h-l; l=h; } printf("%d",a); return 0;}
花匠
Solution
发现实际上是求最长波动子序列, 然后实际上可以用dp做, 但是不如找一下其他的性质, 会发现数列可以表示成下面的形式.
\[ \nearrow \searrow \nearrow \searrow \nearrow \searrow \nearrow \searrow \cdots \] 然后只需要取连续下降子序列中的最大值和连续上升子序列中的最小值.写的非常草率.
Code
#include #include std::stack que;int main(){ int n,h,l; scanf("%d",&n); for(int i=0;i que.top();que.push(h); } else if(l){ if(h>que.top()) que.pop(), que.push(h); else que.push(h),l^=1; } else { if(h
华容道
Solution
#include #include #include #include