题目链接:CodeForces 302E
题意分析:
题意相当复杂,所以需要解释一下。
这题的意思是叫你按照题目要求的指令格式,给出一个指令集,能够把一个小于10^25的正整数 a 变成 a+1。这些指令全都是字符串处理指令,格式为”Si>>Wi”或者”Si<>Wi”,其中Si与Wi是字符串,”<>”型指令表示终止,”>>”型则可以继续,两种指令执行时,都是在正整数a的十进制表示的字符串中寻找第一个子串Si,Si替换成Wi。Si与Wi可为空,而且只包含数字或者”?”。指令的执行是迭代型的,即如果Si是n的一个子串,那么执行完指令后回到指令集第一条进行下一次迭代;如果不是,继续执行下一条。运行成功一条”<>”型指令,迭代结束。最后判断整数a是否变成a+1即可。
题目会给你至多100个正整数,要求你的指令集足够处理这些数,而且要求指令集中指令最多50条,迭代最多200次,所以就不能暴力了。
解题思路:
我们的指令集需要做到一劳永逸,即所有数都可以用这些指令处理,那么我们需要用类似高精度的方法来处理这些数,那么首先,我们需要让指令的处理专注在最后一位,然后逐步往前进行。思路是,利用空字符串(空字符串是任何字符串的子串)和”?”字符来加标注。
第一步,添加标注:
cout<<">>?"<<endl;
第二步,移动标注到最后一位:
cout<<"?"<<i<<">>"<<i<<"?"<<endl; //i为0~9
做完前两步,我们就可以开始高精度的操作了,我们需要切换模式
第三步,切换模式:
cout<<"?>>??"<<endl;
进入正题,开始处理,这时候我们的指令需要分情况处理,即0~8和9,还要主要在这一阶段指令执行可能结束
第四步,处理
for(int i=0;i<9;i++)
cout<<i<<"??<>"<<i+1<<endl;
cout<<"9??>>??0"<<endl;
cout<<"??0<>10"<<endl;
以上就是我们需要的指令,因为指令是按顺序执行的,那么指令在指令集中的顺序其实是需要好好考虑的,这个就看后面的完整代码即可:
代码:
#include<iostream>
using namespace std;
int main(){
int n,tmp;
cin>>n;
while(n--)cin>>tmp;
for(int i=0;i<9;i++) cout<<i<<"??<>"<<i+1<<endl;
cout<<"9??>>??0"<<endl;
cout<<"??0<>10"<<endl;
for(int i=0;i<=9;i++) cout<<"?"<<i<<">>"<<i<<"?"<<endl;
cout<<"?>>??"<<endl;
cout<<">>?"<<endl;
return 0;
}
总结:
CodeForces的题比较考验脑力和读题能力,膜拜这位大神