1 条题解
-
0
自动搬运
来自洛谷,原作者为

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
- 上传者