最近做的最简单的一道模拟题Orz
终于把noip2017的都搞完了。
这道理有几个需要注意的小细节:
1.注意 F i n n的情况,相当与常数。
2.在不循环的部分也要记得判断是否重复变量
3.两个常数的时候记得比大小
其他也就没啥了。
考noip2017的时候栈是什么都不知道,只知道ZZ模拟,也不知道怎么判ERR,骗了50分(好厉害啊,膜去年的自己
代码如下(才60多行,好短啊)
#include <set> #include <string> #include <iostream> #include <cctype> #include <cstdio> #include <cstring> using namespace std; int T,t,mx,top; string s; bool vis[250]; char stk[2050]; int getnum(string s) { int len=s.length(),x=0; for(int i=0;i<len;i++) { if(isdigit(s[i])) x=x*10+s[i]-'0'; } return x; } bool chang[105]; struct Node{int x,y;}; Node get2num(string s) { int len=s.length(),i;Node x;x.x=x.y=0; for(i=0;i<len;i++) {if(isdigit(s[i])) x.x=x.x*10+s[i]-'0';else if(x.x)break;} for(int j=i;j<len;j++) if(isdigit(s[j])) x.y=x.y*10+s[j]-'0'; return x; } int main() { cin>>T; while(T--) { scanf("%d ",&t);getline(cin,s); if(s[2]!='n'&&s[2]=='1') mx=0; else mx=getnum(s);bool flag=0; memset(vis,0,sizeof vis);memset(chang,0,sizeof chang); int flag2=999999,num=0,mxnum=0;top=0; while(t--) { getline(cin,s); if(flag) continue; if(flag2<=top) { if(s[0]=='F') {if(!vis[s[2]])stk[++top]=s[2],vis[s[2]]=1;else puts("ERR"),flag=1;} else if(s[0]=='E')vis[stk[top--]]=0;continue; } else flag2=999999; int len=s.length(); if(s[0]=='F') { if(vis[s[2]]) {puts("ERR");flag=1;continue;} vis[s[2]]=1,stk[++top]=s[2]; Node x=get2num(s); if(x.x==0&&x.y==0) {if(s[4]==s[6]) {chang[top]=1;continue;}} if(x.y) {if(x.x>x.y) {flag2=top;continue;}else {chang[top]=1;continue;}} else if(x.x&&(!isdigit(s[len-1]))){num++,mxnum=max(mxnum,num);} else {flag2=top;continue;} } else if(s[0]=='E') { if(top) {if(!chang[top]) num--;else chang[top]=0;vis[stk[top--]]=0;} else {puts("ERR");flag=1;continue;} } } if(top&&flag==false) {puts("ERR");continue;} if(mx==mxnum&&flag==false) puts("Yes"); else if(flag==false)puts("No"); } return 0; }