E题纯属是诈骗题,很多人估计赛时都是看一眼就被吓跑了,实际上静下心来再看一眼就会爆炸(
题干解析: mootra有个X,数值为n(未知,尤其不要与下面输出描述中的n混淆)
mootra还有1000个变量给你用,其中O1大小为n,其余为零。(很明显在这道题用不了这么多)
六种指令:
1.new x n=n+1(变动X,要明确X就是n!);Ox=n(将X赋值给Ox);(注意这个代码有两个功能,一是将x+1,二是把x(n)赋值给Ox);
2.dec x Ox--;
3.assign x y: Ox=Oy(普通赋值);
4.iftry x goto L: 如果Ox>=0,跳转到第L条语句;
5.ifeq x y goto L: 如果Ox=Oy,跳转到第L条语句;
6.ifneq x y goto L: 如果Ox!=Oy,跳转到第L条语句;
对于后三种语句需保证 Lnow>L(只能回溯)
另外,你不可以使用超过 1000 条语句或者下标超过1000 的寄存器,你的程序实际循环次数不能超过100000次,否则将判错(该题太过简单,不受限制)
ok,进入正题:
任务:
eg.将n变为n+1(实则是指把X变为n+1)
样例:
1(代码用了一行)
new 1(将X+1)
任务eg是给我们示范用的,我们真正目的是把n变为4n,即把X变为4n. 要知道我们变化X值的方法只有一个,就是指令1.new x.该指令可以让X+1,同时把+1后的X赋值给指定变量(Ox)
由于不知道n的具体数值,所以我们无法直接通过3n个new x指令来完成。
哎!我有一计!那我们循环n次,每次三个new x,不就万事大吉等着领首杀奖了吗!
跟循环有关的只有后边三个指令,一眼顶针指令4,只需要在循环体中加入dec x,让Ox每次循环-1,那这不就是while(Ox--)吗!
ok,那我们需要两个变量,一个用于n次循环(类似while(n--)的n),一个用于new增长X.
为什么用两个变量?一个行不行?
注意指令1在给X+1的同时会赋值给指定变量Ox,所以要避免赋值操作覆盖我们-1的操作,因此要两个变量.
另外需要注意,指令4只能向前回溯,所以相比普通while,应该do while更贴切.
同时因为Ox>=0时触发回溯,所以循环条件变量应为n-1。
ok,开始表演:
1.dec 1(因为O*1*初始默认为n,需要-1来达到循环n次的目的)
--开始循环--
2.dec 1(每次循环O*1*-1,可循环n次)
3.new 2(X++,不需要管O*2*大小,与我无瓜)
4.new 2
5.new 2
--一次循环结束--
6.iftry 1 goto 2(每次循环开始时跳到2语句)
(代码共六行,等着拿首杀奖吧)
完结撒花
ps:提交的时候记的要把语言改为php,c++可能会有问题.
顺带一提我的答案是目前步数最少思路最简单的,五步的实现我暂且想不到,有大佬能五步结局的话还望踢我一下。
第一次写题解,语言逻辑也许不清晰,望包涵,目的主要是锻炼自己,能帮到你们当然是最好。:D
再次撒花