CodeForces 302E(好题)

题目链接: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的题比较考验脑力和读题能力,膜拜这位大神

你可能感兴趣的:(CodeForces 302E(好题))