bzoj 4352 tower
来源:互联网 发布:Mac打开hosts文件 编辑:程序博客网 时间:2024/06/05 11:10
题目链接:www.lydsy.com/JudgeOnline/problem.php?id=4352
一道难度适中的动态规划, 但我却很傻逼地想了几天
先建议大家看一下我看的题解:blog.csdn.net/yearwhk/article/details/50254761,如果不明白就可以看我更详细的题解
解题思路:
将所有积木排序,设前i块积木的摆放方法为s[i]。
首先考虑将第i块积木摆放在最下面,因为a[i]>a[1~i-1],a[1~i-1]-a[i]<0,所以肯定合理,即有s[i-1]种方案
其次,在这s[i-1]种方案中,依次寻找第i块积木可以放在前i-1块的哪些积木上,
这时可以用j来记录,j表示第i-1块积木可以放在j块积木上,因为先前已经排过序,所以可以从a[j]开始寻找可以放的积木(关键是已经排好序)
所以下面是代码:
</pre><pre name="code" class="cpp">#include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int maxn=700005;int n,d,s[maxn],a[maxn];long long ans;const int mod=998244353;int main(){ int n,d; scanf("%d%d",&n,&d); for(int i=1;i<=n;i++) { scanf("%d",&a[i]);s[i]=1; } sort(a+1,a+n+1); int j=1,sum=0; for(int i=2;i<=n;i++) if(a[i]-a[j]<d){sum++;s[i]+=sum;} else{sum++;while(a[i]-a[j]>d&&i>j)sum--,j++;s[i]+=sum;} ans=1; for(int i=1;i<=n;i++) ans=(ans*s[i])%mod; printf("%lld\n",ans); return 0;}
1 0
- bzoj 4352 tower
- BZOJ 4352: Tower|暴力
- BZOJ 4657: tower
- BZOJ 1233: [Usaco2009Open]干草堆tower
- BZOJ 1233: [Usaco2009Open]干草堆tower
- BZOJ 1233 [Usaco2009Open]干草堆tower
- bzoj 4657: tower 最小割
- BZOJ 1233: [Usaco2009Open]干草堆tower|动态规划
- [BZOJ 1233][Usaco2009Open]干草堆tower:单调队列
- Tower
- tower
- Ivory Tower
- hdu2971 Tower
- [DP]Tower
- 【计数】tower
- hannuo tower
- Hanoi Tower
- Hanoi Tower
- hdu 1394 Minimum Inversion Number 线段树
- js 动态生成宽度固定的table控件
- 获取验证码的按钮状态变化的实现
- apache2.4 的mpm配置
- 15年12月19日初中提高模拟赛总结
- bzoj 4352 tower
- oracle服务器迁移后注意事项
- 读书笔记--应用资源
- Progressbar、SeekBar进度条,滚动条
- RMAN实战12:ORACLE数据块坏块的检查和恢复
- Install MemCache at window
- 矩阵相乘2
- Qt多线程编程
- vi/vim 常用快捷键