【bzoj3598】: [Scoi2014]方伯伯的商场之旅
Description
Input
Output
输出仅有 1 行,包含 1 个整数,表示最少的代价。
Sample Input
Sample Output
HINT
1 < = L < = R < = 10^15, 2 < = K < = 20
题解:
据说是数位DP水题,EXM?
一开始想了个5维DP……想了想不太对,怂了题解……
先强制性让集合点为最低位,然后得到一个答案,但显然这个不是最优解,那么考虑当某个数集合点从低位转移到高一位的要求,即此位以前数字之和要大于后面数之和,若用$a_{i}(P)$表示P进制下第i位的数字,这个条件就是:$\sum_{x=i+1}^n a_{x}(P)>=\sum_{x=1}^{i-1}a_{x}(P)$。在考虑如何DP。
首先对于强制性选择最低位,可以直接数位DP,这部分很裸;接着,考虑从次低位到最高位为集合点的减少量,记忆化搜索的时候我们传一个选取位置,当当前位数大于等于此值时我们加上此位枚举值,反之减去,若减去到某位后和小于了0,那么说明这个状态不满足进位集合,直接返回0即可。最后我们用第一次DP出的答案减去之后枚举新集合点的减少量即为答案。
(话说第一次打记忆化搜索,感觉怪怪的。)
代码(抄来的233):
#define Troy 10/11/2017
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll f[][**],P;
int num,p[];
inline ll dfs(int pos,int sum,bool limit){
if(pos==) return sum;
if(!limit&&f[pos][sum]!=-) return f[pos][sum];
int end=limit?p[pos]:P-;
ll ret=;
for(int i=;i<=end;i++)
ret+=dfs(pos-,sum+(pos-)*i,limit&&i==end);
if(!limit) f[pos][sum]=ret;
return ret;
}
inline ll dfs(int pos,int up,int sum,bool limit){
if(sum<) return ;
if(pos==) return sum;
if(!limit&&f[pos][sum]!=-) return f[pos][sum];
int end=limit?p[pos]:P-;
ll ret=;
for(int i=;i<=end;i++)
if(pos>=up) ret+=dfs(pos-,up,sum+i,limit&&i==end);
else ret+=dfs(pos-,up,sum-i,limit&&i==end);
return limit==?f[pos][sum]=ret:ret;
}
inline ll calc(ll n){
num=;
do{
p[++num]=n%P;
n/=P;
}while(n);
memset(f,-,sizeof(f));
ll ret=dfs(num,,true);
for(int i=;i<=num;i++)
memset(f,-,sizeof(f)),ret-=dfs(num,i,,true);
return ret;
}
int main(){
ll a,b;
scanf("%lld%lld%lld",&a,&b,&P);
printf("%lld\n",calc(b)-calc(a-));
}
【bzoj3598】: [Scoi2014]方伯伯的商场之旅的更多相关文章
- [BZOJ3598][SCOI2014]方伯伯的商场之旅(数位DP,记忆化搜索)
3598: [Scoi2014]方伯伯的商场之旅 Time Limit: 30 Sec Memory Limit: 64 MBSubmit: 449 Solved: 254[Submit][Sta ...
- BZOJ3598 SCOI2014方伯伯的商场之旅(数位dp)
看到数据范围就可以猜到数位dp了.显然对于一个数最后移到的位置应该是其中位数.于是考虑枚举移到的位置,那么设其左边和为l,左右边和为r,该位置数为p,则需要满足l+p>=r且r+p>=l. ...
- bzoj3598 [Scoi2014]方伯伯的商场之旅
数位dp,我们肯定枚举集合的位置,但是如果每次都重新dp的话会很麻烦,所以我们可以先钦定在最低位集合,dp出代价,然后再一步步找到正确的集合点,每次更改的代价也dp算就好了. #include < ...
- 2019.03.28 bzoj3598: [Scoi2014]方伯伯的商场之旅(带权中位数+数位dp)
传送门 题意咕咕咕自己读吧挺简单的 思路: 由带权中位数的性质可以得到对于每个数放在每个二进制位的代价一定是个单调或者单峰函数,因此我们先把所有的数都挪到第一个位置,然后依次向右枚举峰点(极值点)把能 ...
- 洛谷P3286 [SCOI2014]方伯伯的商场之旅
题目:洛谷P3286 [SCOI2014]方伯伯的商场之旅 思路 数位DP dalao说这是数位dp水题,果然是我太菜了... 自己是不可能想出来的.这道题在讲课时作为例题,大概听懂了思路,简单复述一 ...
- [SCOI2014]方伯伯的商场之旅
Description 方伯伯有一天去参加一个商场举办的游戏.商场派了一些工作人员排成一行.每个人面前有几堆石子.说来也巧,位置在 i 的人面前的第 j 堆的石子的数量,刚好是 i 写成 K 进制后的 ...
- 【数位DP】SCOI2014 方伯伯的商场之旅
题目内容 方伯伯有一天去参加一个商场举办的游戏.商场派了一些工作人员排成一行.每个人面前有几堆石子. 说来也巧,位置在 \(i\) 的人面前的第 \(j\) 堆的石子的数量,刚好是 \(i\) 写成 ...
- 【bzoj3598】 Scoi2014—方伯伯的商场之旅
http://www.lydsy.com/JudgeOnline/problem.php?id=3598 (题目链接) 题意 Solution 原来这就是极水的数位dp,呵呵= =,感觉白学了.htt ...
- BZOJ.3598.[SCOI2014]方伯伯的商场之旅(贪心 数位DP)
题目链接 先考虑,对于确定的一个数,怎样移动代价最少(或者移到哪个位置最优)? 假设我们都移到下标\(1\)位置(设集合点为\(1\)),那么移动到下标\(2\)与\(1\)相比代价差为:\(下标&l ...
随机推荐
- linux 常见命令及说明杂记
systemctl 命令: systemctl 是管制服务的主要工具, 它整合了chkconfig 与 service功能于一体.示例:systemctl is-enabled iptables.se ...
- Fullpage.js全屏滚动jQuery插件
兼容性: 支持 IE8+ 及其他现代浏览器. 主要功能: 1.支持鼠标滚动: 2.支持前进后退键盘控制; 3.多个回调函数; 4.支持手机.移动设备; 5.支持窗口缩放自动调整; 6.可设置滚动宽度. ...
- nifi1.6.0汉化
1.1 测试机 l Apache NiFi 1.6.0 l HDP 2.6.3 l 集群规模:单节点 l 操作系统:CentOs7 l 以下所有操作均在root用户下执行 1.2 安装环境 ...
- jQuery选择器面试题
$("#myELement") 选择id值等于myElement的元素,id值不能重复在文档中只能有一个id值是myElement所以得到的是唯一的元素 $("di ...
- Mybatis与Ibatis比较
随着开发团队转投Google Code旗下,ibatis3.x正式更名为Mybatis 虽然从正式版发布至今也有近一年时间,官方也非常友好的提供了中文版的使用手册,不过相信很多人还在项目中使用iba ...
- Web服务器Tomcat集群与负载均衡技术
我们曾经介绍过三种Tomcat集群方式的优缺点分析.本文将介绍Tomcat集群与负载均衡技术具体实施过程. 在进入集群系统架构探讨之前,先定义一些专门术语: 1. 集群(Cluster):是一组独立的 ...
- Android面试题摘录
本文中面试题全部选自<精通Android>(英文名“Pro android 4”)一书的章后面试题,不过这套面试题与书中内容结合比较紧密,所以选择使用时请谨慎. ####C2:Androi ...
- linux(centos 7)学习之 ~目录下的文件anaconda-ks.cfg
这个文件是记录安装系统的一些信息 #version=DEVEL # System authorization information auth --enableshadow --passalgo=sh ...
- Selenium调用webdriver.chrome()出错
问题描述: 今天因为在学习要使用selenium这个python库,我下载好了selenium,并且也Import成功了,但是在我使用webdirver.chorme()时,却提示PATH路径中没有c ...
- bootstrap-table+x-editable入门
Bootstrap-table 快速入门bootstrap-table----我的表单不可能这么帅. Table of contents Quick start Why use it What's i ...