题目背景

non最近正在为自己的体重而苦恼,他想称量自己的体重。于是,他找来一个天平与许多砝码。

题目描述

砝码的重量均是n的幂次,n^1、n^2、n^3、n^4、n^5的……non想知道至少要多少个砝码才可以称出他的重量m。注意砝码可以放左边,也可以放右边。

输入输出格式

输入格式:

第一行一个正整数m,表示non的重量;

第二行一个正整数n,表示砝码重量幂次的底;

输出格式:

一个整数表示最少所需的砝码数。

输入输出样例

输入样例#1:

99
10
输出样例#1:

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天平的更多相关文章

  1. 洛谷P2405 non天平

    题目背景 non最近正在为自己的体重而苦恼,他想称量自己的体重.于是,他找来一个天平与许多砝码. 题目描述 砝码的重量均是n的幂次,n^1.n^2.n^3.n^4.n^5的……non想知道至少要多少个 ...

  2. 洛谷P2474 [SCOI2008]天平

    P2474 [SCOI2008]天平 题目背景 2008四川NOI省选 题目描述 你有n个砝码,均为1克,2克或者3克.你并不清楚每个砝码的重量,但你知道其中一些砝码重量的大小关系.你把其中两个砝码A ...

  3. 洛谷2474 [SCOI2008] 天平 差分约束->枚举

    题目描述 你有n个砝码,均为1克,2克或者3克.你并不清楚每个砝码的重量,但你知道其中一些砝码重量的大小关系.你把其中两个砝码A 和B 放在天平的左边,需要另外选出两个砝码放在天平的右边.问:有多少种 ...

  4. 洛谷P4180 [Beijing2010组队]次小生成树Tree(最小生成树,LCT,主席树,倍增LCA,倍增,树链剖分)

    洛谷题目传送门 %%%TPLY巨佬和ysner巨佬%%% 他们的题解 思路分析 具体思路都在各位巨佬的题解中.这题做法挺多的,我就不对每个都详细讲了,泛泛而谈吧. 大多数算法都要用kruskal把最小 ...

  5. 洛谷P4180 [BJWC2010]次小生成树(最小生成树,LCT,主席树,倍增LCA,倍增,树链剖分)

    洛谷题目传送门 %%%TPLY巨佬和ysner巨佬%%% 他们的题解 思路分析 具体思路都在各位巨佬的题解中.这题做法挺多的,我就不对每个都详细讲了,泛泛而谈吧. 大多数算法都要用kruskal把最小 ...

  6. 洛谷1640 bzoj1854游戏 匈牙利就是又短又快

    bzoj炸了,靠离线版题目做了两道(过过样例什么的还是轻松的)但是交不了,正巧洛谷有个"大牛分站",就转回洛谷做题了 水题先行,一道傻逼匈牙利 其实本来的思路是搜索然后发现写出来类 ...

  7. 洛谷P1352 codevs1380 没有上司的舞会——S.B.S.

    没有上司的舞会  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond       题目描述 Description Ural大学有N个职员,编号为1~N.他们有 ...

  8. 洛谷P1108 低价购买[DP | LIS方案数]

    题目描述 “低价购买”这条建议是在奶牛股票市场取得成功的一半规则.要想被认为是伟大的投资者,你必须遵循以下的问题建议:“低价购买:再低价购买”.每次你购买一支股票,你必须用低于你上次购买它的价格购买它 ...

  9. 洛谷 P2701 [USACO5.3]巨大的牛棚Big Barn Label:二维数组前缀和 你够了 这次我用DP

    题目背景 (USACO 5.3.4) 题目描述 农夫约翰想要在他的正方形农场上建造一座正方形大牛棚.他讨厌在他的农场中砍树,想找一个能够让他在空旷无树的地方修建牛棚的地方.我们假定,他的农场划分成 N ...

随机推荐

  1. echarts 金字塔

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  2. BZOJ 4568 [Scoi2016]幸运数字(树链剖分 + 异或线性基)

    题目链接  BZOJ 4568 考虑树链剖分+线段树维护每一段区域的异或线性基 对于每个询问,求出该点集的异或线性基.然后求一下这个线性基里面能异或出的最大值即可. #include <bits ...

  3. 洛谷——P1216 [USACO1.5]数字三角形 Number Triangles

    P1216 [USACO1.5]数字三角形 Number Triangles 题目描述 观察下面的数字金字塔. 写一个程序来查找从最高点到底部任意处结束的路径,使路径经过数字的和最大.每一步可以走到左 ...

  4. luogu P1197 [JSOI2008]星球大战

    题目描述 很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统治者整个星系.某一天,凭着一个偶然的机遇,一支反抗军摧毁了帝国的超级武器,并攻下了星系中几乎所有的星球.这些星球通过特殊的以太隧道 ...

  5. kettle变量使用

    公司项目使用kettle重构之前的取数,先研究下日常的使用. 一.建立数据转换,表数据到表输出,其中表输入数据来自其他业务数据库,通过输入sql执行得到数据. 表输入: 表输出: 设置并行4个线程. ...

  6. 【spring mvc】后台的API,测试中,总提示接口实体的某一个字段不能为null,但是明明给值了还提示不能为空

    实体是这三个字段 接口的实现类Controller 前台测试给值 依旧报错 解决方法: 需要添加@RequestBody注解

  7. docker run 报错——WARNING: IPv4 forwarding is disabled. Networking will not work.

    执行  docker run  时遇到如下WARNING: [root@etcd1 volumes]# docker run -d -p 8080:80 -v /tmp/test_mount http ...

  8. C#中二进制,八进制,十六进制到十进制的相互转换

    1.十进制数字向二进制,八进制,十六进制字符串的转换,使用函数 Convert.ToString(int value, int toBase): 它可以把一个数字转换为不同进制数值的字符串格式,其中t ...

  9. 微信小程序日期定位弹出框遮挡问题

    只需要用bindtap绑定一个点击后的操作(隐藏键盘): wx.hideKeyboard()

  10. Spring MVC传值乱码解决

    在web.xml中进行配置,加入以下代码: <!-- 乱码解决 --> <filter> <filter-name>characterEncodingFilter& ...