希望下面我的讲解对你有所帮助,谢谢!
进制规定了数字在数位上逢几进一。
X 进制是一种很神奇的进制,因为其每一数位的进制并不固定!例如说某
种 X 进制数,最低数位为二进制,第二数位为十进制,第三数位为八进制,则X 进制数 321 转换为
十进制数为 65。
现在有两个 X 进制表示的整数 A 和 B,但是其具体每一数位的进制还不确
定,只知道 A 和 B 是同一进制规则,且每一数位最高为 N 进制,最低为二进制。
请你算出 A B 的结果最小可能是多少。
请注意,你需要保证 A 和 B 在 X 进制下都是合法的,即每一数位上的数字要小于其进制。
【输入格式】
第一行一个正整数 N,含义如题面所述。
第二行一个正整数 Ma,表示 X 进制数 A 的位数。
第三行 Ma 个用空格分开的整数,表示 X 进制数 A 按从高位到低位顺序各
个数位上的数字在十进制下的表示。
第四行一个正整数 Mb,表示 X 进制数 B 的位数。
第五行 Mb 个用空格分开的整数,表示 X 进制数 B 按从高位到低位顺序各
个数位上的数字在十进制下的表示。
请注意,输入中的所有数字都是十进制的。
【输出格式】
输出一行一个整数,表示 X 进制数 A B 的结果的最小可能值转换为十进
制后再模 1000000007 的结果。
【样例输入】
11
3
10 4 0
3
1 2 0
【样例输出】
94
【样例说明】
当进制为:最低位 2 进制,第二数位 5 进制,第三数位 11 进制时,减法
得到的差最小。此时 A 在十进制下是 108,B 在十进制下是 14,差值是 94。
【评测用例规模与约定】
对于 30% 的数据,N ≤ 10; Ma, Mb ≤ 8.
对于 100% 的数据,2 ≤ N ≤ 1000; 1 ≤ Ma, Mb ≤ 100000; A ≥ B.
贪心
或许在考试中的你和我一样没有读懂X进制的意思,但是我希望大家都读懂了,因为这道题目只要读懂了这个专有名词,那么90%可以完全做出来。
继续看题目: X进制下的321 转化为十进制为 65(最低数位为二进制,第二数位为十进制,第三数位为八进制)。
What?不应该是213嘛(3 * 8 ^ 2 + 2 * 10 ^ 1 + 1 * 2 ^ 0 = 213),怎么题目说是65呢。
或许你会和我一样会一直纠结在这里(考试中),等我们再三确定这种思路是错的时候,那么我们就应该去仔细想一想原本的十进制转换,然后再来看一看能不能运用到这题上。
eg:13(十进制)
1 是如何进位过去的呢?
是不是相对于个位满了10再进位过去的,简单来说就是个位数了十下然后进了一位1
eg:100(十进制)
这个1又是怎么过去的呢?
我们都很清楚这个1其实是经过两次进位的,那就是先从最低位进位到第二位,再从第二位进位到最高位,由于每次进位都是进了1(相对于数了十下),
第一位 => 第二位:10
第二位 => 第三位:10
是不是相对于一共数了100下(每10个第一位进位第二位才能触发一个第二位进位到第三位,相对于就是 10 * 10)。
eg: 10(X进制) = ?(十进制)
(假设13(X进制)最高位为十进制,最低为二进制)
我们运用上面的思想,最高位的1是怎么传过去的呢?
是不是相对于最低位满了2再进位过去的。简单来说就是个位数了两下然后进了一位1
相对于10(X进制) = 2(十进制)
eg:123(X进制)= ? (十进制)
(假设123(X进制) 最高位为八进制,第二位为十进制,最低为四进制)
最低位 => 第二位: 2 * 4
第二位 => 第三位 4 * 10 * 1 (意思就是先最低位到第二位要数十下,第二位到第三位要数10下)
相对于 123(X进制)= 4 * 10 * 1 + 2 * 4 + 3 (十进制)
现在我们已经有了一种X进制的猜想,接下来就是验证码我们的猜想是不是对的(其实也不能叫猜想,相对于是我们根据我们熟悉的十进制来进行演练的)
需验证:321(X进制) = 65(十进制)
最低数位为二进制,第二数位为十进制,第三数位为八进制)
根据我们的猜想:
最低位到第二位: 2 * 2
第二位到第三位: 2 * 10 * 3
那么我们猜想的答案就是 1 + 2 * 2 + 2 * 10 * 3 = 65
刚刚好,我们和答案一样了,或许会存在偶像性,那么我们再验证一下上面的样例:
(1)10 4 0
最低位 2 进制,第二数位 5 进制,第三数位 11 进制
样例的答案是108
那么我们来算一下:0 + 4 * 2 + 2 * 5 * 10 = 108
(2)1 2 0
最低位 2 进制,第二数位 5 进制,第三数位 11 进制
样例的答案为14
那么我们来算一下: 0 + 2 * 2 + 2 * 5 * 1 = 14
两个样例都通过了,那么我们的猜想99.99999%就是对的了
或者仔细的你已经注意到前面的算法标签了 —— 贪心
题目要求的是求最小值,然后A >= B。
我们可以简单一点来看就是:所求 => (Ai - Bi)* (P1乘到Pi-1)
前者是固定的,所以要最小,只需要后面最小就OK了,那就是让每一位的进制最小就可以了。但是你有没有想过,前者可能是负的,题目只是说A >= B,但是没有说Ai >= Bi;虽然这种做法是对的,但是没有那么的严谨,所以,下面是两个证明:
证明1:AcWing 4404. X 进制减法(贪心做法,并给出证明)
证明2:第十三届蓝桥杯C++ B组讲解
(该题的讲解在视频的17分26秒处)
上面的两个证明足以让你明白这个贪心的正确性
以下是相关的代码
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 1e5 + 10,MOD = 1e9 + 7;
int n,m1,m2,m;
int a[N],b[N];
int main(){
cin >> n >> m1;
for(int i = m1 - 1;i >= 0;i --) cin >> a[i];
cin >> m2;
for(int i = m2 - 1;i >= 0;i --) cin >> b[i];
int m = max(m1,m2);
int res = 0;
for(int i = m;i >= 0;i --){
res = (res * (long long)(max({2,a[i] + 1,b[i] + 1})) + a[i] - b[i]) % MOD;
}
cout << res << endl;
return 0;
}
由于作者本人还在学习算法的路上,所以若有不足,还请指正,希望上面我的讲解对你有所帮助,谢谢!
我正在尝试使用Curbgem执行以下POST以解析云curl-XPOST\-H"X-Parse-Application-Id:PARSE_APP_ID"\-H"X-Parse-REST-API-Key:PARSE_API_KEY"\-H"Content-Type:image/jpeg"\--data-binary'@myPicture.jpg'\https://api.parse.com/1/files/pic.jpg用这个:curl=Curl::Easy.new("https://api.parse.com/1/files/lion.jpg")curl.multipart_form_
我正在使用Ruby,我正在与一个网络端点通信,该端点在发送消息本身之前需要格式化“header”。header中的第一个字段必须是消息长度,它被定义为网络字节顺序中的2二进制字节消息长度。比如我的消息长度是1024。如何将1024表示为二进制双字节? 最佳答案 Ruby(以及Perl和Python等)中字节整理的标准工具是pack和unpack。ruby的packisinArray.您的长度应该是两个字节长,并且按网络字节顺序排列,这听起来像是n格式说明符的工作:n|Integer|16-bitunsigned,network(bi
问题1:我无法通过以下方式找到将负整数转换为二进制的方法。我应该像这样转换它。-3=>"11111111111111111111111111111101"我在下面试过:sprintf('%b',-3)=>"..101"#..appearsanddoesnotshow111111bit.-3.to_s(2)=>"-11"#Thisjustadds-tothebinaryofthepositiveinteger3.问题2:有趣的是,如果我使用在线转换器,它告诉我-3的二进制是“0010110100110011”。"11111111111111111111111111111101"和"001
给定一个元素和一个数组,Ruby#index方法返回元素在数组中的位置。我使用二进制搜索实现了我自己的索引方法,期望我的方法会优于内置方法。令我惊讶的是,内置的在实验中的运行速度大约是我的三倍。有Rubyist知道原因吗? 最佳答案 内置#indexisnotabinarysearch,这只是一个简单的迭代搜索。但是,它是用C而不是Ruby实现的,因此自然可以快几个数量级。 关于Ruby#index方法VS二进制搜索,我们在StackOverflow上找到一个类似的问题:
目录前言: 一、ASC分析代码实现二、 卡片分析代码实现三、 直线分析代码实现四、货物摆放分析代码实现小结:前言: 在刷题的过程中,发现蓝桥杯的题目和力扣的差别很大。让人有一种不一样的感觉,蓝桥杯题目偏向对于实际问题用编程去的解决,而力扣给人感觉很锻炼自己的编程思维,逻辑能力。两者结合去刷,相信会有不一样的收获。 一、ASC 已知大写字母A的ASCII码为65,请问大写字母L的ASCII码是多少?分析 这道题目看上去很简单,我们需确定自己计算的准确,所以我建议用编程去解决。代码实现publicclassTest8{publicstaticvoidmain(String[]args){Sy
我知道我可以使用Fixnum#to_s将整数表示为二进制格式的字符串。但是1.to_s(2)生成1而我希望它生成00000001。我怎样才能使所有返回的字符串都以零作为填充到8个字符?我可以使用类似的东西:binary="#{'0'*(8-(1.to_s(2)).size)}#{1.to_s(2)}"if(1.to_s(2)).size但这看起来不是很优雅。 最佳答案 使用字符串格式。"%08b"%1#=>"00000001" 关于ruby-如何在Ruby中返回整数的固定长度二进制表示?
我正在尝试使用Ruby将二进制文件转换为十六进制。目前我有以下内容:File.open(out_name,'w')do|f|f.puts"constunsignedintmodFileSize=#{data.length};"f.puts"constcharmodFile[]={"first_line=truedata.bytes.each_slice(15)do|a|line=a.map{|b|",#{b}"}.joiniffirst_linef.putsline[1..-1]elsef.putslineendfirst_line=falseendf.puts"};"end这是以下代
我有一个类似C的结构:SomeStruct:lenVarsstring:namestring:lname#...end我在:Person之前有一堆偏移量和长度。所有偏移量和长度都描述了:Person结构中的数据。如何从指定的偏移量、给定的长度或直到下一个偏移量开始读取数据? 最佳答案 寻求偏移1234,然后将32个字节读入Strings:open'some-binary-file','r'do|f|f.seek1234s=f.read32#thoinyourcase,somethinglike:o=aBinData_object.r
如何在ruby中将十六进制字符串转换为32位有符号整数?例如a="fb6d8cf1"#hexstring[a].pack('H*').unpack('l')#fromthedocumentationitunpackstoits32bitsignedint它转换为-242455045但实际答案是-76706575你能指出我做错了什么吗? 最佳答案 您似乎遇到了字节序问题。这给出了期望的结果:[a].pack("H*").unpack("l>")#=>[-76706575]["038a67f90"].pack("H*").unpac
如果我运行以下代码,前两行会返回我所期望的结果。然而,第三个返回2的二进制表示。2.to_s#=>"2"2.to_s*2#=>"22"2.to_s*2#=>"10"我知道在调用to_s时传入2会将我的输出转换为二进制,但为什么to_s忽略第三个中的*案件?如果有任何不同,我正在运行Ruby1.9.2。 最佳答案 对,正如Namida已经提到的,Ruby解释2.to_s*2作为2.to_s(*2)因为方法调用中的圆括号在Ruby中是可选的。这里的星号就是所谓的splatoperator.这里唯一令人费解的问题是为什么*2的计算结果为2