【洛谷 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 ...
随机推荐
- LeetCode OJ--Binary Tree Postorder Traversal
http://oj.leetcode.com/problems/binary-tree-postorder-traversal/ 树的后序遍历,可以使用递归,也可以使用栈,下面是栈的实现代码 #inc ...
- AC日记——绿色通道 codevs 3342
3342 绿色通道 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 黄金 Gold 题解 查看运行结果 题目描述 Description <思远高考绿色通道&g ...
- IOS-input元素光标偏移乱跑,是什么原因
这中情况只会出现在一些ios手机上,是兼容性的问题,当然我没有认真的确认过是出现在那些ios系统上的: 之所以出现这种情况,肯定是在input上或TA的父元素上用到了position:fixed; 目 ...
- 2017 [六省联考] T1 期末考试
4868: [Shoi2017]期末考试 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 842 Solved: 385[Submit][Status ...
- [JSOI 2015] 子集选取
4475: [Jsoi2015]子集选取 Time Limit: 1 Sec Memory Limit: 512 MBSubmit: 363 Solved: 255[Submit][Status] ...
- 弹出层layer演示 以及在编写弹出层时遇到的错误
实现的功能: 首先第一步 在官方下载layer的文件.layUI官网:http://layer.layui.com/ http://layer.layui.com/ layer文件的下载步骤如 ...
- 【bootstrap】bootstrap中的tooltip的使用
先看看效果图:[当光标放在下面这个时间搜索框上时,显示一段文字:搜索时间段中的流水信息] 这样的效果,怎么实现呢? 很简单 1.引入jQuery.js和bootstrap的js和css 2.给想要有t ...
- 百度地图之标注一组地理坐标<2>
一.需求 开发移动地图相关的应用有时会有这种需求:在地图上显示自己的定位,然后想查看周边使用这个应用的有哪些人.当然完毕这个功能须要后台数据的支持.你要把自己的位置信息发给后台,后台在依据你的位置查询 ...
- angular 图片加载失败 情况处理? 如何在ionic中加载本地图片 ?
1.angular 图片加载失败 情况处理 在directive中定义组件,在ng-src错误时,调用err-src app.directive('errSrc',function(){ return ...
- mt-datetime-picker type="date" 时间格式 bug
1.mint-ui 中 mt-datetime-picker 组件,存在日期格式 bug <!-- 日期选择器 --> <template> <div class=&qu ...