bzoj 3598 方伯伯的商场之旅
Written with StackEdit.
Description
方伯伯有一天去参加一个商场举办的游戏。商场派了一些工作人员排成一行。每个人面前有几堆石子。说来也巧,位置在 \(i\) 的人面前的第\(j\) 堆的石子的数量,刚好是 \(i\) 写成 \(K\) 进制后的第 \(j\) 位。
现在方伯伯要玩一个游戏,商场会给方伯伯两个整数\(L,R\)。方伯伯要把位置在 \([L, R]\)中的每个人的石子都合并成一堆石子。每次操作,他可以选择一个人面前的两堆石子,将其中的一堆中的某些石子移动到另一堆,代价是移动的石子数量 * 移动的距离。商场承诺,方伯伯只要完成任务,就给他一些椰子,代价越小,给他的椰子越多。所以方伯伯很着急,想请你告诉他最少的代价是多少。
例如:10 进制下的位置在 12312 的人,合并石子的最少代价为:
\(1 * 2 + 2 * 1 + 3 * 0 + 1 * 1 + 2 * 2 = 9\)
即把所有的石子都合并在第三堆.
Input
输入仅有 1 行,包含 3 个用空格分隔的整数 \(L,R,K\),表示商场给方伯伯的 2 个整数,以及进制数.
Output
输出仅有 1 行,包含 1 个整数,表示最少的代价.
Sample Input
3 8 3
Sample Output
5
Hint
\(1 < = L < = R < = 10^{15}, 2 < = K < = 20\)
Solution
- 考虑数位dp计算出\([1,R]\)的答案,再减去\([1,L-1]\)的答案.
- 一开始可以无脑将集结点设置在第1位,用一次数位dp计算出.(dfs1)
- 然后考虑调整集结点.将集结点从\(i\)调整至\(i+1\)对答案造成的影响再用\(O(k)\)次数位dp计算出.(dfs2)
- 在dfs2中注意若贡献小于0,应返回0,即不执行集结点的调整.
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
inline ll read()
{
ll out=0,fh=1;
char jp=getchar();
while ((jp>'9'||jp<'0')&&jp!='-')
jp=getchar();
if (jp=='-')
{
fh=-1;
jp=getchar();
}
while (jp>='0'&&jp<='9')
{
out=out*10+jp-'0';
jp=getchar();
}
return out*fh;
}
ll k;
const int MAXN=100;
int t[MAXN],n;
ll f[MAXN][3010];
ll dfs1(int pos,int st,int lim)//数位dp,填到了第pos位,当前总和为st.
{
if(pos==0)
return st;
if(lim==0 && f[pos][st]!=-1)
return f[pos][st];
int mx=lim?t[pos]:k-1;
ll ans=0;
for(int i=0;i<=mx;++i)
ans+=dfs1(pos-1,st+i*(pos-1),lim && i==mx);
if(lim==0)
f[pos][st]=ans;
return ans;
}
ll dfs2(int pos,int st,int m,int lim)//将集结点调节为m的情况下计算最优答案
{
if(st<0)
return 0;
if(pos==0)
return st;
if(lim==0 && f[pos][st]!=-1)
return f[pos][st];
int mx=lim?t[pos]:k-1;
ll ans=0;
for(int i=0;i<=mx;++i)
{
if(pos>=m)
ans+=dfs2(pos-1,st+i,m,lim && i==mx);
else
ans+=dfs2(pos-1,st-i,m,lim && i==mx);
}
if(lim==0)
f[pos][st]=ans;
return ans;
}
ll solve(ll x)
{
for(n=0;x;x/=k)
t[++n]=x%k;
memset(f,-1,sizeof f);
ll res=dfs1(n,0,1);
for(int i=2;i<=n;++i)//将集结点从i-1调整至i,更新答案.
{
memset(f,-1,sizeof f);
res-=dfs2(n,0,i,1);
}
return res;
}
int main()
{
ll l=read(),r=read();
k=read();
ll ans=solve(r)-solve(l-1);
printf("%lld\n",ans);
return 0;
}
代码参考了dalao的blog.
bzoj 3598 方伯伯的商场之旅的更多相关文章
- [BZOJ3598][SCOI2014]方伯伯的商场之旅(数位DP,记忆化搜索)
3598: [Scoi2014]方伯伯的商场之旅 Time Limit: 30 Sec Memory Limit: 64 MBSubmit: 449 Solved: 254[Submit][Sta ...
- 「SCOI2014」方伯伯的商场之旅 解题报告
「SCOI2014」方伯伯的商场之旅 我一开始的想法会被两个相同的集合位置去重给搞死,不过应该还是可以写的,讨论起来老麻烦. 可以先钦定在\(1\)号点集合,然后往后调整一部分. 具体一点,通过前缀和 ...
- 「SCOI2014」方伯伯的商场之旅
「SCOI2014」方伯伯的商场之旅 题目描述 方伯伯有一天去参加一个商场举办的游戏.商场派了一些工作人员排成一行.每个人面前有几堆石子.说来也巧,位置在 \(i\) 的人面前的第 \(j\) 堆的石 ...
- 洛谷P3286 [SCOI2014]方伯伯的商场之旅
题目:洛谷P3286 [SCOI2014]方伯伯的商场之旅 思路 数位DP dalao说这是数位dp水题,果然是我太菜了... 自己是不可能想出来的.这道题在讲课时作为例题,大概听懂了思路,简单复述一 ...
- 【bzoj3598】: [Scoi2014]方伯伯的商场之旅
Description 方伯伯有一天去参加一个商场举办的游戏.商场派了一些工作人员排成一行.每个人面前有几堆石子.说来也巧,位置在 i 的人面前的第 j 堆的石子的数量,刚好是 i 写成 K 进制后的 ...
- [SCOI2014]方伯伯的商场之旅
Description 方伯伯有一天去参加一个商场举办的游戏.商场派了一些工作人员排成一行.每个人面前有几堆石子.说来也巧,位置在 i 的人面前的第 j 堆的石子的数量,刚好是 i 写成 K 进制后的 ...
- 【数位DP】SCOI2014 方伯伯的商场之旅
题目内容 方伯伯有一天去参加一个商场举办的游戏.商场派了一些工作人员排成一行.每个人面前有几堆石子. 说来也巧,位置在 \(i\) 的人面前的第 \(j\) 堆的石子的数量,刚好是 \(i\) 写成 ...
- bzoj 3598 [ Scoi 2014 ] 方伯伯的商场之旅 ——数位DP
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3598 数位DP...东看西看:http://www.cnblogs.com/Artanis/ ...
- bzoj 3598 [Scoi2014]方伯伯的商场之旅——数位dp
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3598 TJ:https://www.cnblogs.com/Zinn/p/9351218.h ...
随机推荐
- 20145201《Java程序设计》第7周学习总结
20145201 <Java程序设计>第七周学习总结 教材学习内容总结 本周学习了课本第十二.十三章内容,即Lambda.时间与日期 第十二章 Lambda 12.1 认识Lambda语法 ...
- 20145219 《Java程序设计》第16周课程总结
20145219 <Java程序设计>第16周课程总结 每周读书笔记(即学习总结)链接汇总 第0周问卷调查 第1周读书笔记 第2周读书笔记 第3周读书笔记 第4周读书笔记 第5周读书笔记 ...
- Qt debug和release
debug会默认给变量赋初始值,但是release不会. 所以: 在头文件中声明指针P* p时,最好给它初始化:P* p=NULL; 不然有可能造成野指针的情况
- 剑指offer题解02-10
02 单例模式 单例模式,是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单例的特殊类.通过单例模式可以保证系统中,应用该模式的类一个类只有一个实例.即一个类只有一个对象实例. 从具体实现角 ...
- anacoda的spyder在调用matplotlib的时候无法显示动画效果【学习笔记】
ipython console的默认设置将图像结果显示在终端,但是这样显示存在的问题是无法显示动画效果,因此需要将动画效果显示到单独的窗口,按照下面的截图即可显示. 方法一.按照如下截图显示设置,重启 ...
- jvm-内存区域与内存溢出异常
内存区域与内存溢出异常 参考: http://www.cnblogs.com/ityouknow/p/5610232.html 所有的Java开发人员可能会遇到这样的困惑?我该为堆内存设置多大空间呢? ...
- 转: 在hibernate中查询使用list,map定制返回类型
在使用hibernate进行查询时,使用得最多的还是通过构建hql进行查询了.在查询的过程当中,除使用经常的查询对象方法之外,还会遇到查询一个属性,或一组聚集结果的情况.在这种情况下,我们通常就需要对 ...
- DFS - 深度搜索 - 基于邻接列表表示法
2017-07-25 15:38:00 writer:pprp 在前一篇图基于邻接列表表示法的代码加了一小部分,加了一个DFS函数,visited[N]数组 参考书目:张新华的<算法竞赛宝典&g ...
- ZC_疑问
1. 应该可以将所有的 jni需要的函数都放在一个 dll中(Windows下),然后 多个java项目就只要调用一个dll了. 可以测试一下 2.
- 英语每日阅读---3、VOA慢速英语(翻译+字幕+讲解):哈佛大学被控歧视亚裔学生
英语每日阅读---3.VOA慢速英语(翻译+字幕+讲解):哈佛大学被控歧视亚裔学生 一.总结 一句话总结:Harvard Accused of Discriminating Against Asian ...