1 条题解

  • 0
    @ 2025-8-24 21:23:45

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar a1_1
    **

    搬运于2025-08-24 21:23:44,当前版本为作者最后更新于2019-01-02 21:29:23,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    P1322 【logo语言】

    我写了两种方法,一种递归,一种模拟交了10次A了2次(三次90,一次80)????????

    递归(绝对纯递归):

    #include<bits/stdc++.h>
    using namespace std;
    int dg()
    {
        string s;
        char c;
        int k,l=0,v;
        while (cin>>c)//回车+^z自动结束输入.
        {
            if (c==']') break;//特判像"REPEAT 1[] BK 1"这样的情况,不然只有90.
            cin>>s>>k;
            if (c=='R') 
            {
                v=getchar();//读'['.
                l+=k*dg();
                v=getchar();//读']'后' '.
            }
            if (c=='B') v=getchar(),l-=k;
        	if (c=='F') v=getchar(),l+=k;
        	if (v==int(']')) break;//如果v==int(' ')就一直读
        }
        return l;//这里就不必多说了
    }
    int main()
    {
        cout<<abs(dg());//巨短主函数
        return 0;
    }
    

    是不是巨短???才0.42kb!!!


    模拟(绝对纯模拟,不含一丁点递归和栈):

    #include<bits/stdc++.h>
    using namespace std;
    struct logo
    {
        int v;
        char c;
        int d;
        int i;
    }a[150];
    bool cmp(logo a,logo b)
    {
        if (a.d!=b.d) return a.d>b.d;
        else return a.c>b.c;//巧用字典排序
    }
    int main()
    {
        int n,m,j,k=0,l=0,i=0,o=1,p=0,w=0;
    	char c,v;
        string s;
        while (cin>>c)
        {
        	if (isupper(c)) 
        	{
        		i++;
        		cin>>s>>a[i].v;
        		a[i].c=c;a[i].d=k;//a[i].c存命令等级,a[i].d存运算等级(过于抽象,只可意会不可言传)
            }
            if (c=='[') {k++;l=0;}//等级++
            if (c==']') 
            {
                k--;
                sort(a+o,a+o+i,cmp);//repeat语句内的命令按运算等级和命令等级
                for (j=o;j<=i;j++)
                {
                    if (a[j].c=='R') l=l*a[j].v;//计算repeat语句内部
                    if (a[j].c=='F') l=l+a[j].v;//同上
                    if (a[j].c=='B') l=l-a[j].v;//同上
                }
                o=j;//下一次执行命令的起始位置
                if (k==0) p=p+l;
            }
            if (v=='['&&c==']') w=1;//特判像"REPEAT 1[] BK 1"这样的情况,不然只有90.
            v=c;
        }
        if (o==1||w==1)//如果没有repeat语句的情况
        {
            sort(a+o,a+o+i,cmp);
            for (j=o;j<=i;j++)
            {
                if (a[j].c=='R') l=l*a[j].v;
                if (a[j].c=='F') l=l+a[j].v;
                if (a[j].c=='B') l=l-a[j].v;
            }
            p=p+l;
        }
        cout<<abs(p)<<endl;
        return 0;
    }
    
    

    模拟是不是巨长???1.13kb!!!


    模拟很容易被hack,欢迎大佬hack

    敬请大佬指出错误

    P.S.可以看看我坎坷的AC道路

    • 1

    信息

    ID
    320
    时间
    1000ms
    内存
    125MiB
    难度
    3
    标签
    递交数
    0
    已通过
    0
    上传者