【洛谷 2405】 non天平
题目背景
non最近正在为自己的体重而苦恼,他想称量自己的体重。于是,他找来一个天平与许多砝码。
题目描述
砝码的重量均是n的幂次,n^1、n^2、n^3、n^4、n^5的……non想知道至少要多少个砝码才可以称出他的重量m。注意砝码可以放左边,也可以放右边。
输入输出格式
输入格式:
第一行一个正整数m,表示non的重量;
第二行一个正整数n,表示砝码重量幂次的底;
输出格式:
一个整数表示最少所需的砝码数。
输入输出样例
99
10
2
说明
【数据范围】
对于30%的数据点,m <= 2^63 - 1
对于100%的数据点,0 <= m <= 10^10000, 0 < n <= 10000
分析:对于本题的数据范围,势必要高精了。
首先说明白一点:天平使用原则:左物右码。
那么题目可以等效成这样:右边的质量-左边的质量=给出的质量,所以砝码就有了加减两个策略可以选择
我们先来看题目的样例:99
99的得出有两种大的方向:加策略 和 减策略
首先加策略的话,需要9*10+9*1 ->18个
其次减策略的话,需要1*100-1*1 ->2个
样例减策略要优于加策略。
原题目也就等价于这样一个等式
k0*10^0+k1*10^1+k2*10^2+k3*10^3=99 这里我们假设左边就三项把 方便研究
k的系数可正可负,正就是放在右边,负就是放在左边。
那么我们要求∑|k|最小,可以这样想: 我们先考虑最小的质量是1的砝码,我们要确定使用了几个1砝码,那么我们就要把个位的9补平,要么是10-1,需要一个; 要么是0+9,需要9个;
显然减一下好,而且减掉一个刚好。于是我们确定了上述方程的第一项系数k0= -1
那么方程就是这样:-1*10^0+k1*10^1+k2*10^2+k3*10^3=99
把第一项移到右边:k1*10^1+k2*10^2+k3*10^3=100
我们看到我们成功的把个位填平了,使得方程可以同除以10
那么就变成了k1*10^0+k2*10^1+k3*10^2=10
于是到这里我们看到了问题具有很强的 最优子结构性质。
而无后效性是显然的,我们确定了小法吗的个数后,右边的个位被填平,所以我们不在需要小法吗
于是问题就是一道DP问题。
而这个m是一个高精数,在说我们的n=10是很特殊的,对于其他的n我们 要进行很多的 m div n 和m mod n操作
于是我们整体的预处理一下,
把m进行n进制的分解
不断的把 计算m mod n这个余数,记录,再把m div n,把m除干净为止;
于是我们得到了n进制下的 每一位上的数字,对应于我们每一个数量级的砝码
对于每一位我们有两个策略,直接使用yu【i】这么多的砝码,或者用n-yu【i】这么多的砝码进上去,两种操作都可以使n进制下的个位变成0
于是我们发现他其实是0/1 DP 也就是说我们开一个数组f【0..m,0..1】,前一维意思是处理到n进制下的第i位,后一维意思是我们当前这一位的处理策略 0代表直接拿出yu【i】这么多的砝码,1代表我们把当前位补平,进到下一位去
数组元素存储处理完当前第i位需要的砝码数
于是状态转移方程:
f[i,0]:=min(f[i-1,0]+yu[i],f[i-1,1]+yu[i]+1);
f[i,1]:=min(f[i-1,0]+b-yu[i],f[i-1,1]+b-yu[i]-1);
写状态转移方程的时候仔细一点就不会错:使用f【i-1,1】的时候,我们当前位就+1
#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<cstring>
using namespace std;
char cl[];
int head,ym[],m[],n,h[],laji[];
int ln,lm,tail,f[][];
void deal()//转N进制。
{
int i;
while()
{
int u=;
tail=-;
int yu=;
for(i=;i<lm;i++)
{
tail++;
u=yu*+m[i];
h[tail]=u/n;
yu=u%n;
}
head++;
ym[head]=yu;
for(i=;i<lm;i++)
if(h[i]!=) break;
for(int j=i;j<lm;j++)
m[j-i]=h[j];
lm-=i;
if(lm<=ln) {
int po=;
for(i=;i<lm;i++)
po=po*+m[i];
head++;
ym[head]=po%n;
po=po/n;
head++;
ym[head]=po;
break;
}
}
}
int main()
{
cin>>cl;
lm=strlen(cl);
cin>>n;
if(n==) cout<<cl;
else
{
for(int i=;i<lm;i++)
m[i]=cl[i]-'';
deal();
int ans=;
f[][]=;
for(int i=;i<head;i++)
{
f[i][]=min(f[i-][]+ym[i],f[i-][]+ym[i]+);
f[i][]=min(f[i-][]+n-ym[i],f[i-][]+n-ym[i]-);
}
cout<<min(f[head-][],f[head-][]);
}
return ;
}
【洛谷 2405】 non天平的更多相关文章
- 洛谷P2405 non天平
题目背景 non最近正在为自己的体重而苦恼,他想称量自己的体重.于是,他找来一个天平与许多砝码. 题目描述 砝码的重量均是n的幂次,n^1.n^2.n^3.n^4.n^5的……non想知道至少要多少个 ...
- 洛谷P2474 [SCOI2008]天平
P2474 [SCOI2008]天平 题目背景 2008四川NOI省选 题目描述 你有n个砝码,均为1克,2克或者3克.你并不清楚每个砝码的重量,但你知道其中一些砝码重量的大小关系.你把其中两个砝码A ...
- 洛谷2474 [SCOI2008] 天平 差分约束->枚举
题目描述 你有n个砝码,均为1克,2克或者3克.你并不清楚每个砝码的重量,但你知道其中一些砝码重量的大小关系.你把其中两个砝码A 和B 放在天平的左边,需要另外选出两个砝码放在天平的右边.问:有多少种 ...
- 洛谷P4180 [Beijing2010组队]次小生成树Tree(最小生成树,LCT,主席树,倍增LCA,倍增,树链剖分)
洛谷题目传送门 %%%TPLY巨佬和ysner巨佬%%% 他们的题解 思路分析 具体思路都在各位巨佬的题解中.这题做法挺多的,我就不对每个都详细讲了,泛泛而谈吧. 大多数算法都要用kruskal把最小 ...
- 洛谷P4180 [BJWC2010]次小生成树(最小生成树,LCT,主席树,倍增LCA,倍增,树链剖分)
洛谷题目传送门 %%%TPLY巨佬和ysner巨佬%%% 他们的题解 思路分析 具体思路都在各位巨佬的题解中.这题做法挺多的,我就不对每个都详细讲了,泛泛而谈吧. 大多数算法都要用kruskal把最小 ...
- 洛谷1640 bzoj1854游戏 匈牙利就是又短又快
bzoj炸了,靠离线版题目做了两道(过过样例什么的还是轻松的)但是交不了,正巧洛谷有个"大牛分站",就转回洛谷做题了 水题先行,一道傻逼匈牙利 其实本来的思路是搜索然后发现写出来类 ...
- 洛谷P1352 codevs1380 没有上司的舞会——S.B.S.
没有上司的舞会 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description Ural大学有N个职员,编号为1~N.他们有 ...
- 洛谷P1108 低价购买[DP | LIS方案数]
题目描述 “低价购买”这条建议是在奶牛股票市场取得成功的一半规则.要想被认为是伟大的投资者,你必须遵循以下的问题建议:“低价购买:再低价购买”.每次你购买一支股票,你必须用低于你上次购买它的价格购买它 ...
- 洛谷 P2701 [USACO5.3]巨大的牛棚Big Barn Label:二维数组前缀和 你够了 这次我用DP
题目背景 (USACO 5.3.4) 题目描述 农夫约翰想要在他的正方形农场上建造一座正方形大牛棚.他讨厌在他的农场中砍树,想找一个能够让他在空旷无树的地方修建牛棚的地方.我们假定,他的农场划分成 N ...
随机推荐
- udp 多播2
11.3 多播 单播用于两个主机之间的端对端通信,广播用于一个主机对整个局域网上所有主机上的数据通信.单播和广播是两个极端,要么对一个主机进行通信,要么对整个局域网上的主机进行通信.实际情况下,经常 ...
- 无密码登录Linux
配置主机A无密码登录主机B 主机A:192.168.1.110 主机B:192.168.1.111 先确保所有主机的防火墙处于关闭状态. 在主机A上执行如下: 1. $cd ~/.ssh 2. $ss ...
- 使用Zint和Zxing实现二维码的编码与解码(Using open-source tools to generate and decode Q-R code)
1.Zint生成二维码 http://sourceforge.net/projects/zint/ [1]从上述站点下载Zint工具 [2]安装Zint工具 [3]使用Zint工具生成二维码,注意选择 ...
- webstrom配置一键修复ESLint的报错
因为项目本身有用eslint,而我这边没用,我这边提交上去别人update后就会提示很多eslint的格式错误提示,所以就在该项目里使用了eslint. 发现一般有两种安装方式,我使用的是webstr ...
- 关于main()
1.在c语言中: int main( void ) int main( int argc, char *argv[] ) 如果不需要从命令行中获取参数,请用int main(void) :否则请用in ...
- PyTorch学习笔记之Variable_and_function_cat
application 1 from torch.autograd import Variable import torch b = Variable(torch.FloatTensor([64, 1 ...
- 拦截器及 Spring MVC 整合
一.实验介绍 1.1 实验内容 本节课程主要利用 Spring MVC 框架实现拦截器以及 Spring MVC 框架的整合. 1.2 实验知识点 Spring MVC 框架 拦截器 1.3 实验环境 ...
- Servlet 3.0的AsyncListener接口
Servlet 3.0的AsyncListener接口 作者:chszs,转载需注明. 博客主页:http://blog.csdn.net/chszs 一.Servlet 3.0介绍 Servlet ...
- SpringMVC:文件上传
MultipartFile attach HttpServletRequest re commons-io-2.0.jar (一定要用2.0以上的版本,否则没有copyInputStreamToFil ...
- c#列表操作
Enumerable[从元数据] // // 摘要: // 从序列的开头返回指定数量的连续元素. // // 参数: ...