转跳到内容

Mr.K 018

【会员】高级会员
  • 内容数

    716
  • 加入

  • 最后访问

  • 赢得天数

    1

Mr.K 018 发表的所有内容

  1. 有糖拿的! 给出伪代码就行,能拿200节操(max)呢!
  2. 这个题不难哦,数据结构第一章内容 少侠不来试试吗?
  3. 真要是java转汇编,那这个题怕是真的要做一个月 每 月 算 法 挑 战
  4. 一步到位草 好 既然你都这么说了,那就这么定了吧
  5. 对这道题而言是的 但是显然下一道题就不会这么轻松了x
  6. 第20期来啦! 如各位所见,我给自己挖了两个需要填上的大坑…… 这个题虽然是一个表达式求值,但考虑到以后可能出现的冰系魔法2b啥的(暗示),说明这题的目的不是简单的表达式求值哦。大家不一定非要打一个表达式求值的板子出来。 第20期 冰系魔法2a 传说在某个异世界里是存在元素的,也存在元素魔法。那里有一所魔法学院。与其他魔法学院不同,这所学院哪个系的魔法也不教,教的全是魔法背后玄而又玄的深奥知识。但是,来这所学院求学的人却是络绎不绝,因为从这所学院里学到大成之人已经可以自创一系魔法,早已超脱用某个系魔法施法的境界。不过,我们地球人想要一下理解异世界的艰深魔法理论还是很困难的,所以我们当然不会直接像大成之人那样自创魔法。我们从最简单的开始。 在那个异世界有一个魔法小工具,叫做骰娘魔法骰子。向这个骰子输入一个掷骰表达式(别问怎么输入,问就是魔法),这个骰子就能按照表达式的要求自动掷骰子,然后输出(别问怎么输出,问就是魔法)结果。这个小工具在异世界非常流行,几乎家家户户都有。 异世界魔法骰子比地球的骰娘要强大很多。地球的骰娘最多只支持形如rAdB+C的表达式,表示投掷A个B面的均匀骰子,结果取出目的总和再加上C。异世界的骰娘不光支持掷骰,还支持加减乘除四则运算。并且,表达式还能嵌套,允许加括号。比如说:(r3*5+7d2*(r1d6)-1)/2。这个表达式的意思是:先掷一枚6面骰子,出目乘2后减去1,作为骰子的面数(记为A),之后投掷15+7=22个这样的骰子(注意每个骰子都有A个面,而非每个骰子的面数都不相同),出目总和除以2,舍弃小数部分后作为结果输出。 我们规定,括号的运算优先级最高(废话),其次是乘除法,再次是加减法,最后是掷骰子运算。 MrK-018手头已经有了一些用来进行四则运算、模拟掷骰子和输出用的魔法。给定一个掷骰子表达式,他想知道怎样按顺序地调用这些魔法,才能得到表达式要求的输出。 输入 一个掷骰表达式。保证涉及到的数字只有十进制非负整数,不涉及小数。整数可能以以下几种形式出现: 一般形式,如114514 科学计数法,如1.14e5,1.14E5,3E8等等。 输出 这个表达式对应的魔法调用序列。对于不符合文法的表达式,输出一行Syntax error!。输出的数字格式要与 样例输入1 (r3*5+7d2*(r1d6)-1)/2 样例输出1 输出不唯一,此处展示一种可行的输出。 1: rd 1 6 2: mul 2 [1] 3: sub [2] 1 4: mul 3 5 5: add [4] 7 6: rd [5] [3] 7: div [6] 2 8: out [7] 样例输入2 4e50 样例输出2 1: out 4e50 样例输入3 4d 样例输出3 Syntax error!
  7. 我觉得可以改成:在剩下两个没有炸弹的地方里,抽了一个告知蕾米莉亚;已知告诉她没有炸弹的那个地点是图书馆
  8. 已更新,概率论忘光了,不知道想的对不对
  9. 三门问题?三门问题的正确解我记得是换门来着,不过我得想一下是不是同样 ---Upd1--- 第1层:我们只考虑炸弹在哪这个问题。 我们首先认为P(地下室)=P(门卫室)=P(图书馆)=1/3,而P(地下室|不在图书馆)=1/2,所以去哪都一样。 第2层:把这个问题当成三门问题考虑。 三门问题的答案是应该换门,具体为啥我就不用多说了,网上全是。因此,应该改去门卫室。 第5层:考虑到古明地觉希望看到红魔馆爆炸这个假设。 若炸弹在地下室,古明地觉告诉蕾米莉亚“炸弹不在图书馆”以后,蕾米莉亚肯定会认为这个问题是个三门问题,就会改去门卫室找炸弹,古明地觉想看红魔馆爆炸的意图就达成了。所以这条消息一定是阿共古明地觉的阴谋,还是应该去地下室。 以此类推, 第n(n为奇数且大于等于5)层:考虑到第n-1层的阴谋,应该去地下室; 第n(n为偶数且大于5)层:考虑到第n-1层的阴谋,应该去门卫室。 ---Upd2--- 又仔细想了想,觉得这个题只是题面跟三门问题一样,但实际上不同。原因在于在三门问题中,主持人是挑一扇后面是羊的门放掉,这个行为实际上改变了另外两扇门出现羊的概率。用本题类比,就是如果炸弹实际上就在图书馆,古明地觉就会说炸弹不在值班室了。但实际的本题是从题干上禁止了这个情况出现的。换句话说,在这道题里的三个可能地点和三门问题中的三扇门不同。所以我觉得问题本质上就是一个炸弹在哪的问题,应该取上述第1层的结论,后面都是千层饼骚话。
  10. Java和C这样的成熟的语言语法其实很复杂,但是词法部分其实还算简单,因为无非就关键字/运算符/常量/标识符这么几大类,再往下分也不是词法分析能干的事情。所以这些语言的词法分析任务不难,写一个DFA,然后遍历一遍输入的程序就完了 实际上调库的话也是得自己定义出词法的确切定义的,flex和antlr能做的只是帮你搭一个DFA,没了。这也是为什么这里允许调库,但是要给出相应库使用的脚本
  11. 没事 执此flex/bison/antlr4,微笑面对词法分析器,java是大便(
  12. 不是parser,lexer就行 parser预计是2,不过工作量太大了,我不知道要不要出
  13. 第19期来力! 照例是个模拟题,这一期敲样例输出可把我累坏了( 有工具专门做这件事没错,所以用了工具的要贴出所有源代码(包括工具的输入脚本等)哦 虽然写了1,但是估计不会有2,因为我估计2的工作量就太大了,不符合我们的初衷。不过这道题还好。 第19期 冰系魔法1 传说在某个异世界里是存在元素的,也存在元素魔法。有一次,那个世界的来客向我们展示了一种那个世界的冰系魔法: public class Artia{ public static void main(String[] argv){ System.out.println("Artia's Ice Magic"); } } MrK-018发现,这段魔法的咒语好像可以分解成一个个的单词,好像还能给单词分类。不过,手动把它们一个个摘出来也太麻烦了,还是写一个程序自动区分出魔法咒语里的单词吧。 输入 一段Java源代码冰系魔法咒语。保证符合语法规范。 输出 对每个单词,输出其单词序号、原文和单词类别。格式参考输出样例。 样例输入 package artia; import java.util.*; public class Artia{ char ch = 'a'; String str = "Artia's Ice magic"; public static void main(String[] argv){ double d = 10.25+1; System.out.println(str); return; } } 样例输出 Token 1: 'package', 'package' Token 2: 'artia', identifier Token 3: ';', ';' Token 4: 'import', 'import' Token 5: 'java', identifier Token 6: '.', '.' Token 7: 'util', identifier Token 8: '.', '.' Token 9: '*', '*' Token 10: ';', ';' Token 11: 'public', 'public' Token 12: 'class', 'class' Token 13: 'Artia', identifier Token 14: '{', '{' Token 15: 'char', 'char' Token 16: 'ch', identifier Token 17: '=', '=' Token 18: '\'a\'', character Token 19: ';', ';' Token 20: 'String', identifier Token 21: 'str', identifier Token 22: '=', '=' Token 23: '"Artia\'s Ice magic"', string Token 24: ';', ';' Token 25: 'public', 'public' Token 26: 'static', 'static' Token 27: 'void', 'void' Token 28: 'main', identifier Token 29: '(', '(' Token 30: 'String', identifier Token 31: '[', '[' Token 32: ']', ']' Token 33: 'argv', identifier Token 34: ')', ')' Token 35: '{', '{' Token 36: 'double', 'double' Token 37: 'd', identifier Token 38: '=', '=' Token 39: '10.25', floating Token 40: '+', '+' Token 41: '1', integer Token 42: ';', ';' Token 43: 'System', identifier Token 44: '.', '.' Token 45: 'out', identifier Token 46: '.', '.' Token 47: 'println', identifier Token 48: '(', '(' Token 49: 'str', identifier Token 50: ')',')' Token 51: ';', ';' Token 52: 'return', 'return' Token 53: ';', ';' Token 54: '}', '}' Token 55: '}', '}' Token 56: <EOF>, <EOF>
  14. 终点没开之前是墙,而且不允许停(那样就太没意思了(笑)) 而且,这个DFS是没法找到最短路径的,会导致有些能yes的例输出no
  15. 第18期来啦! 第18期 汉化组的吃人陷阱1 MrK-019有一次不小心暴露了自己会中日英三语和视频剪辑的事实,现在某个汉化组已经布下了天罗地网,只要时机一到就要把他收入囊中,调教成无情的汉化机器! 已知汉化组布下的天罗地网是一种格子迷宫,只有一个出口。迷宫大概是这样的: ###### #K...# ####.# #S...# ###### 如图所示,图上标为#的地方都是墙,标.的地方都是可以走的部分。MrK-019初始所在的地方也是可以走的部分。MrK-019一秒可以走一格。出口只在某一秒开放,平时都是不能走的墙;如果MrK-019在出口开放的那一秒到达出口,他就能逃脱汉化组的吃人陷阱,否则就会被抓住吃掉(指调教成无情的汉化机器)。同时,由于汉化组的人就在后面穷追不舍,MrK-019必须不停地移动才行! MrK-019能不能从汉化组的吃人陷阱里逃出来呢? 输入 第一行是三个整数m,n,s,分别表示迷宫的长和宽,以及出口在第几秒开放。 接下来是一个m*n的字符矩阵,表示汉化组设下的迷宫。格式见题干和输入样例。 输出 如果MrK-019能逃出来,就输出一行Yes,否则输出一行No。 样例输入1 5 6 8 ###### #K...# ####.# #S...# ###### 样例输出1 Yes 样例输入2 5 6 9 ###### #K...# ####.# #S...# ###### 样例输出2 No
  16. 今天呢,今天决定来一道丧心病狂的题目! 来看题: 第17期. 这不是一个丧心病狂的题目 题目描述: 输入中每行以十进制形式给出一个整数N (),输出该数字在英文中的表达。 英文中数字的表达遵循如下规则: 1.0-19分别直接以如下的单词进行表达: { "zero","one","two","three", "four","five","six","seven", "eight","nine","ten","eleven", "twelve","thirteen","fourteen","fifteen", "sixteen","seventeen","eighteen","nineteen" }; 2.20-99,用一个单词或两个单词连接进行表达。若能被10整除则直接用一个单词进行表达: { "twenty","thirty","forty","fifty", "sixty","seventy","eighty","ninety" }; 若不能被10整除,则将十位和个位用连字符连接。如23在英文中的表达为"twenty-three"。 3. 100-999,先表示百位,再表示十位和个位,并以and连接。如123在英文中的表达为"one hundred and twenty-three" 4.对于不小于1000的数字,从右向左,每三位将数字划分一次。对于每一部分,先直接表示,然后加上对应的单位。如果一部分的三个数字都是0则直接省略。如12,345在英文中的表达为"twelve thousand three hundred and forty-five" 从高位到低位,每部分的单位分别为 { "billion",//10^9 "million",//10^6 "thousand",//10^3 ""//1, needs to add nothing }; 输入: 多组用例,以EOF结束。每行以十进制形式给出一个整数N () 输出: 对于每个输入的整数,输出一行,为该数字在英文中的表达。 输出中不允许开头,结尾或单词之间出现任何多余的空格(' ')或连字符('-')。 召唤阵: @yhz012 @inuisanaa @ZERC @随性而为 @NianRuoshui @摸鱼奇才咖啡喵
  17. 我刚才看了下,好像Linux也有做这事的API,貌似是mmap
  18. 关于第四步优化,可以参考MSDN上的介绍: https://docs.microsoft.com/en-us/windows/win32/memory/creating-a-file-mapping-object 真的就是字面意义上的,像访问数组一样访问文件内容……
  19. 召唤 @yhz012 这个题我觉得就是那种很狗的题。 做之前:???这也能做? 做之后:???就这? 解这个题需要对数独终局的两条引理: 引理1. 任意给定数独的第一行,可以构造出至少一个合法的数独终局。(实际上某一行即可,这里为了简便,就说是第一行) 怎么构造呢?可以像这样构造: 1 2 3 4 5 6 7 8 9 4 5 6 7 8 9 1 2 3 7 8 9 1 2 3 4 5 6 2 3 4 5 6 7 8 9 1 5 6 7 8 9 1 2 3 4 8 9 1 2 3 4 5 6 7 3 4 5 6 7 8 9 1 2 6 7 8 9 1 2 3 4 5 9 1 2 3 4 5 6 7 8 可以看出,这么构造过之后每一行、每一列、每一个九宫格之内1-9都恰好出现了一次。 这样的话,由于左上角的值不能变,剩下八个数能产生8!=40,320种排列。到这里还不够两百万,为了达到我们二百万终局的目标,我们还需要引理2. 引理2. 任给一个合理的数独终局,重新排列这个终局的前三行,所得终局仍然相同;对中间三行和后三行也成立。 举个例子:把上例中的第4行和第6行交换,得到的数独终局仍然合法;或者说,把7,8,9行重新排列成9,8,7行,得到的新数独终局仍然成立。 由于第一行有限制,它只好继续呆在第一行,因此前三行有2种排法;中间三行和后三行没什么限制,分别可以产生6种排法。 这样的话,任给一个数独终局,我们能构造出2*6*6=72个数独终局(包括给的那个终局)。 并用引理1和引理2,我们就能用这样的很简单的操作构造出多达72*40,320=2,903,040种不同的数独终局! 事实上,中间三行和后三行是可以整体交换的,这样可以构造出的数独终局数量还能再加倍。不过我们只要两百万种,不这么交换也够用了。 这样,我们就给出了能过掉normal的算法。当然,这个算法稍微做一点优化(主要是磁盘IO方面的),也是可以过掉hard和extreme难度的。实际上如果这个算法都过不掉的话,很难想象还有什么算法能过掉了,毕竟这道题输出量是非常大的…… 算法大意如下: 1. 首先构造出初始的第一行:从1排到9,然后把需要在左上角的那个数换过去。 2. 对第一行剩下8个数进行全排列,对每一个排列进行下述操作: 2.1 按照引理1提供的方法填满其余的格子; 2.2 按照引理2排列各行,输出之,直到输出数量够为止。 最后再说一下怎么就优化吧。这一部分其实不是算法本身关注的重点,不过还是简单说一下。 首先按照上面算法直接写,用C++的输入输出库的话,可以搞定normal难度,但是hard难度是跑不通的。 第一步优化:扔掉所有C++输入输出方法,改用C语言的输出函数。这比C++的同样方法快得多。(所以说这里的优化都是一些无聊的小细节) 第二步优化:不要每输出一个数字就调用一次C语言输出函数,而是每输出一次数独调用一次。这样可以大幅减少函数调用的次数。(无聊细节+1)到此可以过掉hard难度。 第三步优化:其实交换两行的时候,不用整个一起交换的。可以记录一个“行索引表”,对行的交换只在索引表上进行。这需要对算法进行一些修改。 第四步优化:连C语言的输入输出函数都扔掉,而是直接用Windows的API。Windows的文件映射功能可以让程序可以像访问内存一样访问文件,进一步提高了磁盘的利用效率。这样,extreme难度也可以过掉了。 相比算法本身来说,这个优化过程就显得平凡很多了。而且在OJ平台上也没有Windows API可以调用不是么(笑
  20. 真的有那么魔鬼的嘛?(笑 而且三角函数还好吧,我这里难题都是解析几何和导数……
  21. 不会的不会的,不会那么机械无趣的 在思考要不要给第二个提示,不过这个提示给出来跟直接告诉题解也没区别了(
×
×
  • 新建...

重要消息

为使您更好地使用该站点,请仔细阅读以下内容: 使用条款