题目背景

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. 标准C程序设计七---114

    Linux应用             编程深入            语言编程 标准C程序设计七---经典C11程序设计    以下内容为阅读:    <标准C程序设计>(第7版) 作者 ...

  2. bq25896 charging status CHRG_STAT register 0xB

    condition 1 :                    adapter 全部電流往 system去,                    battery current 也往 system ...

  3. HDU 2767:Proving Equivalences(强连通)

    题意: 一个有向图,问最少加几条边,能让它强连通 方法: 1:tarjan 缩点 2:采用如下构造法: 缩点后的图找到所有头结点和尾结点,那么,可以这么构造:把所有的尾结点连一条边到头结点,就必然可以 ...

  4. 转:c++ Oracle OCCI 编程

    原地址http://blog.sina.com.cn/s/blog_53a72add01015zj4.html 找不到具体的出处,只好不写了. OCCI数据库ORACLE编程步骤1. 配置环境(1)  ...

  5. 树(弱化版)(lca)

    3306: 树 时间限制: 10 Sec  内存限制: 256 MB 题目描述 给定一棵大小为 n 的有根点权树,支持以下操作:  • 换根  • 修改点权      • 查询子树最小值 输入 第一行 ...

  6. JD静态网页

    1.制作导航栏 ul>li*n>a 2.制作竖线 a.利用border b.利用  | c.利用矩形,宽度设为1,设置背景色,padding = 0 3.制作下三角 (1)◇ (2)两个盒 ...

  7. Android-Service基本用法、AIDL、Binder连接池详解

    本文介绍Service与Activity之间的通信,文章包含以下内容: 一.Service基本用法 二.通过AIDL实现Service与Activity跨进程通信 三.Binder连接池 四.使用Me ...

  8. CentOS 笔记

    对安装CentOS安装使用过程中的问题做一个笔记,第一次安装,安装的是7.0版本,最小化安装. 安装环境 :Windows 2012 R2 Standard,Hyper-V Virstual Mach ...

  9. Jmeter Summariser report及其可视化

    Jmeter summariser report的设置在:bin/jmeter.properties #------------------------------------------------ ...

  10. zerorpc的安装

    1.简介及安装 rpc使构建分布式系统简单许多,在云计算的实现中有很广泛的应用 rpc可以是异步的 python实现rpc,可以使用标准库里的SimpleXMLRPCServer,另外zerorpc是 ...