题目背景

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. spring+jpa+HiKariCP+P6spy SSH HiKariCP P6spy

    =============p6spy准备https://www.cnblogs.com/qgc88===================== 1.简单介绍p6spy,p6spy是一个开源项目,通常使用 ...

  2. luogu P2056 采花

    题目描述 萧芸斓是 Z国的公主,平时的一大爱好是采花. 今天天气晴朗,阳光明媚,公主清晨便去了皇宫中新建的花园采花.花园足够大,容纳了 n 朵花,花有 c 种颜色(用整数 1-c 表示) ,且花是排成 ...

  3. Maven自动部署war到Tomcat8

    原文:http://www.cnblogs.com/yucongblog/p/5392932.html 我使用的环境是:Eclipse Java EE IDE for Web Developers(V ...

  4. eclipse项目java版本更改

    然后.右键点击项目->properties->Java Compiler->....如图 ​ 最后,右键点击项目->properties->Project  Facets ...

  5. 老司机找bug的十年心路历程

    一.码畜:靠编译器帮自己查语法错误 消灭笔误:编写适合程序猿的键盘练习 if (常量==变量或表达式) 使用goto接力超长的if,switch 连续的if还是if elseif 多个条件的组合:精心 ...

  6. 改进的SMS4算法的差分故障与暴力联合攻击

    改进的SMS4算法的差分故障与暴力联合攻击 (1.中国科学院研究生院,北京100049) 摘要SMS4是在国内正式使用并于2006年发布的第一个用于无线局域网的商用分组password算法.文中研究了 ...

  7. C++静态库与动态库深入研究

    什么是库 库是写好的现有的,成熟的,可以复用的代码.现实中每个程序都要依赖很多基础的底层库,不可能每个人的代码都从零开始,因此库的存在意义非同寻常. 本质上来说库是一种可执行代码的二进制形式,可以被操 ...

  8. C++11 并发指南三(std::mutex 详解)(转)

    转自:http://www.cnblogs.com/haippy/p/3237213.html 上一篇<C++11 并发指南二(std::thread 详解)>中主要讲到了 std::th ...

  9. Effective C++ 条款一 视C++为一个语音联邦

    1.C语言         区块.语句.预处理器.内置数据类型.数组.指针等内容 2.OC++       类.封装.继承.多态.virtual函数 等 3.Template C++       泛型 ...

  10. adb命令具体解释(二)——手机缺失sqlite3时操作数据库的多种解决方式

    在android应用开发无处不在SQLite数据库的身影.那么在开发中怎么使用adb命令操作数据库的功能呢? 以下我们将完整的介绍与数据库操作相关的命令集及当手机缺少sqlite3的时候的多种解决方式 ...