※这是一道提交答案题
感谢祝丞阳提供SPJ
题目描述
在尚未有计算机的远古时代,人们用可以刻下整数的石块和魔法完成复杂的计算工作。
在一片空地上,有n+1 个位置可供放置石块,这些位置编号为0...n 。一个哥布林可以受你的指挥对
石块进行操作,包括捡起和丢弃手中的石块,以及做简单的运算以及判断,来完成特定的计算任务。
位置1...n 一开始没有石块,但为了方便开展计算, 0号位置初始有一个刻着0 的石块。
在这个简易计算机系统中,输入和输出也是刻着整数的石块。输入石块以特定的顺序排列在一起,哥布
林只能以规定好的顺序获取他们。哥布林可以将手中的石块交给你,称为输出了它,当然被输出的石块
就不能在之后的计算中被哥布林使用了。
想要给这个计算机系统编写程序,你可以在纸上按顺序写下一些指令,形式包括:
input:获取下一个输入石块。 output:让哥布林将手中的石块输出。 goto x:跳转到第x个指令。 got0 x:如果哥布林手中的石块刻了0,就跳转到第x个指令,否则执行下一个指令。 got- x:如果哥布林手中的石块刻了负数,就跳转到第x个指令,否则执行下一个指令。 copy id:将放在位置编号id的石块复制一份到哥布林手中。 ypoc id:将哥布林手中的石块复制一份到位置编号id。 add id:将哥布林手中的石块的数字修改为其加上位置id处的石块上的数字的值。 sub id:将哥布林手中的石块的数字修改为其减去位置id处的石块上的数字的值。 dda id:将位置id处的石块上的数字+1,同时将该石块复制一份到哥布林手中。 bus id:将位置id处的石块上的数字-1,同时将该石块复制一份到哥布林手中。需要注意:
1. 哥布林手中至多存在一个石块,因此在执行 input copy dda bus 命令的时候,如果哥布林将要 获取新石块,且它手中原本有石块,它会将其丢弃。同样地,每个位置也只能存在一个石块,因此 在执行 ypoc 命令时,原本位于此处的石块(假如有)将被丢弃。
2. 在执行需要使用哥布林手中的石块的命令( output ypoc got0 got- add sub )时,如果哥布林 手中没有石块,它会报告错误,计算任务就会以失败告终。同样地,如果需要使用某个位置的石块 ( copy add sub dda bus )但该地没有石块,哥布林也会报告错误。
3. 如果访问编号 >n或< 0 的位置,或者跳转到一个不存在的指令,哥布林也会报告错误。
你需要完成若干类型的计算任务:
1. 对于输入的每个数,输出其乘以 4之后的结果。
2. 对于输入的每个数,输出其乘以 40之后的结果。
3. 对于输入的每个数 ,若x< 0 ,依次输出x,x+1,x+2...0 ,否则依次输出x,x-1,x-2...0
。 4. 对于输入的每三个数,输出他们从小到大排序之后的结果。保证输入有三的倍数个石块。
5. 按 i从小到大输出输入中第2i-1 个和第2i 个数的乘积。保证输入有偶数个石块,且输入石块上 的数都是非负数。
6. 对于输入的每个数,按从小到大的顺序输出它的质因子(一个质因子要重复输出其指数次,例如输 入12 应输出2 2 3 ),保证输入石块上的数都 >1。
当发生以下几种情况之一时,程序正常终止:
1. 最后一个指令执行完毕,并在最后一个指令没有发生跳转。
2. 执行 input 命令时已经没有输入石块了。
3. 输出的石块数量达到了所进行的计算任务的预期值。
你需要在写下特定数量以内的指令,并在哥布林执行特定数量以内的指令的情况下完成计算任务,详情 请见输入格式和数据范围。
输入格式
对于每组数据输入四个整数type,n,t0,t1 ,依次代表计算任务的类型,位置编号的上限,写下指令的个 数上限与哥布林执行指令的个数上限。
输出格式
你无需提交源代码,你应当在选手目录下建立文件 stone1.out ~ stone10.out ,代表你对应测试点 的输出文件。
对于每个输出文件,第一行输出一个正整数 ,表示指令的个数,应当满足m<=t0 。
接下来 行输出你的代码。
样例
样例1输入
1 1 9 12345样例1输出
9 input ypoc 1 copy 0 add 1 add 1 add 1 add 1 output goto 1评测方式
评测时会利用一些数据(这些数据不下发,但你可以通过下发的 checker 进行评测)作为输入运行你的 代码,用你的代码运行指令个数的最大值和 进行比较,如果不超过 则称你的代码执行指令个数满 足要求。若对于每组数据的每个测试点你的代码长度,答案和运行指令数均满足需求,你就可以得到该 测试点的分数。
为了检验你的代码是否正确,我们下发了一个名为 checker.cpp 的文件用于测试你的代码。用选项 -O2 -std=c++14 进行编译,打开可执行文件,第一行输入你希望测试的计算任务类型编号,之后按【输出 格式】所述的格式输入你的代码,就可以看到你的代码输出是否正确以及各组数据花费指令的个数。保 证 checker 所使用的测试数据与最终的测试数据一致,且保证对于同一种计算任务,所使用的测试数据 组一致。 当 checker 无法正确结束运行,或者返回了不同于你的预期的结果时,请检查你的输入格式是否存在问 题。
输入&check
数据范围
保证输入石块上的整数绝对值不超过100 ,且存在一种指令编写方式,使得计算过程中任意石块上的整 数绝对值不超过$10^9$ 。若你的代码在计算过程中超出了该限制,所可能造成的扣分应自行承担。