【bzoj4428】[Nwerc2015]Debugging调试 数论+记忆化搜索
题目描述
输入
输出
样例输入
16 1 10
样例输出
44
题解
数论+记忆化搜索
看题第一眼dp,设 $f[i]$ 表示 $i$ 行代码最坏情况下的最短时间。那么枚举添加的printf语句数,可以得出dp方程:$f[i]=f[\lceil\frac i{j+1}\rceil]+jp+r$ 。
考虑优化:$\lceil\frac ni\rceil$ 和下取整一样最多只有 $O(\sqrt n)$ 个值。方法:从大到小枚举 $i$ ,令 $last=\lceil\frac n{\lceil\frac ni\rceil}\rceil$ ,则 $last$ 就是最后一个满足 $\lceil\frac nj\rceil=\lceil\frac ni\rceil$ 的 $j$ 。由于要让方程中的 $j$ 尽量小,因此使用 $last$ 转移。下一次令 $i=last-1$ 即可。
但是这样 $O(n\sqrt n)$ 的时间复杂度还是过不了,考虑进一步优化:只有一个询问,因此无需知道大多数无用的 $f$ 值。使用记忆化搜索,这样更新的结果就只有 $f[\lceil\frac ni\rceil]$ 了。
使用微积分知识可以证得时间复杂度为 $O(n^{\frac 34})$ (和杜教筛证明方法相同)
#include <cstdio>
#include <algorithm>
using namespace std;
typedef long long ll;
ll f[1000010] , r , p;
inline int cdiv(int x , int y)
{
return (x + y - 1) / y;
}
ll solve(int n)
{
if(n == 1) return 0;
if(f[n]) return f[n];
int i , j;
f[n] = 1ll << 62;
for(i = n ; i != 1 ; i = j - 1)
j = cdiv(n , cdiv(n , i)) , f[n] = min(f[n] , solve(cdiv(n , i)) + (j - 1) * p + r);
return f[n];
}
int main()
{
int n;
scanf("%d%lld%lld" , &n , &r , &p);
printf("%lld\n" , solve(n));
return 0;
}
【bzoj4428】[Nwerc2015]Debugging调试 数论+记忆化搜索的更多相关文章
- BZOJ4428 : [Nwerc2015]Debugging调试
设$f[i]$为最优策略下调试$i$行代码的时间,则: $f[1]=0$ $f[i]=\min((j-1)\times p+f[\lceil\frac{i}{j}\rceil])+r$ 意义为枚举pr ...
- 【BZOJ4428】[Nwerc2015]Debugging调试 记忆化搜索+分块
[BZOJ4428][Nwerc2015]Debugging调试 Description 你看中的调试器将不会在这件事上帮助你.有代码可以通过多种方式在调试与正式发布的间隙发生不同的行为,当出现这种情 ...
- uva 10581 - Partitioning for fun and profit(记忆化搜索+数论)
题目链接:uva 10581 - Partitioning for fun and profit 题目大意:给定m,n,k,将m分解成n份,然后依照每份的个数排定字典序,而且划分时要求ai−1≤ai, ...
- LOJ2803 CCC2018 平衡树 数论分块、记忆化搜索
传送门 题意差评,其实就是一个递推式:\(f_1 = 1 , f_i = \sum\limits_{j=2}^i f_{\lfloor \frac{i}{j} \rfloor}\),然后求\(f_N\ ...
- bzoj 4428: [Nwerc2015]Debugging调试
4428: [Nwerc2015]Debugging调试 Description Your fancy debugger will not help you in this matter. There ...
- [hihocoder 1033]交错和 数位dp/记忆化搜索
#1033 : 交错和 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描写叙述 给定一个数 x,设它十进制展从高位到低位上的数位依次是 a0, a1, ..., an - 1 ...
- UVa 10599【lis dp,记忆化搜索】
UVa 10599 题意: 给出r*c的网格,其中有些格子里面有垃圾,机器人从左上角移动到右下角,只能向右或向下移动.问机器人能清扫最多多少个含有垃圾的格子,有多少中方案,输出其中一种方案的格子编号. ...
- [ACM_动态规划] 数字三角形(数塔)_递推_记忆化搜索
1.直接用递归函数计算状态转移方程,效率十分低下,可以考虑用递推方法,其实就是“正着推导,逆着计算” #include<iostream> #include<algorithm> ...
- 【BZOJ-3895】取石子 记忆化搜索 + 博弈
3895: 取石子 Time Limit: 1 Sec Memory Limit: 512 MBSubmit: 263 Solved: 127[Submit][Status][Discuss] D ...
随机推荐
- 20155338 2016-2017-2 《Java程序设计》第3周学习总结
20155338 2016-2017-2 <Java程序设计>第3周学习总结 教材学习内容总结 本周学习量比较多,但是知识点并不是特别难,学习了书本的第四五章,其中个人重点学习了数组对象. ...
- [BZOJ1185][HNOI2007]最小矩形覆盖-[凸包+旋转卡壳]
Description 传送门 Solution 感性理解一下,最小矩形一定是由一条边和凸包上的边重合的. 然后它就是模板题了..然而真的好难调,小于大于动不动就打错. Code #include&l ...
- 【bzoj4827】[Hnoi2017]礼物 FFT
题目描述 我的室友最近喜欢上了一个可爱的小女生.马上就要到她的生日了,他决定买一对情侣手 环,一个留给自己,一个送给她.每个手环上各有 n 个装饰物,并且每个装饰物都有一定的亮度.但是在她生日的前一天 ...
- 日志采集框架 Flume
日志采集框架 Flume 1 概述 Flume是一个分布式.可靠.和高可用的海量日志采集.聚合和传输的系统. Flume可以采集文件,socket数据包等各种形式源数据,又可以将采集到的数据输出到H ...
- 获取label标签内for的属性值-js
<body> <div class="row_2" id="ass"> <label for="aaa"> ...
- [shell] 循环判断输入值
做个记录 until [[ $flag == "yes" || $flag == "exit" ]] do read -p "请确认统一/合服前后数据 ...
- 20135313_exp5
课程:Java程序与设计 班级:1353 姓 名:吴子怡 学号:20135313 小组成员: 20135113肖昱 成绩: 指导教师:娄嘉鹏 实验日期:2 ...
- Hadoop环境搭建01
根据马士兵老师的Hadoop进行的配置 1.首先列下来需要用到的软件 VirtulBox虚拟机.Centos7系统镜像.xshell.xftp.jdk安装包.hadoop-2.7.0安装包 2.在Vi ...
- Right-BICEP 测试四则运算程序
测试方法: Right-BICEP 测试计划: 1.边界测试是否正确 2.负数表示是否实现 3.是否有乘除法 4.是否可以选择题目数量 5.是否有输出方式 6.是否有括号 7.是否有重复查询 ...
- ACM 第二十天
积性函数.杜教筛 练习题 莫比乌斯函数之和 51Nod - 1244 莫比乌斯函数,由德国数学家和天文学家莫比乌斯提出.梅滕斯(Mertens)首先使用μ(n)(miu(n))作为莫比乌斯函数的记号. ...