题目大意:给出多个程序以及其时间复杂度,判断'Yes','No'或'ERR'。
做法:
这种做法比较耗时,但是稳。
每次读进来一个程序,先check是否ERR,然后深搜求解其时间复杂度。
没什么好说的,上代码:
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; int T,L; char ch[105][105]; int s[105],tl; bool use[28]; void p1(){printf("Yes\n");} void p2(){printf("No\n");} void p3(){printf("ERR\n");} bool check() { for(int i=1;i<=L;i++) { if(ch[i][1]=='F') { for(int j=1;j<=20;j++) { if(ch[i][j]>='a'&&ch[i][j]<='z') { int c = ch[i][j]-'a'+1; if(use[c])return 0; use[c]=1; s[++tl]=c; break; } } }else { if(tl==0)return 0; use[s[tl]]=0; tl--; } } if(tl!=0)return 0; return 1; } int dfs(int l,int r) { int ret = 0; if(l>r)return 0; int fr = l,cnt=0; for(int i=l;i<=r;i++) { if(ch[i][1]=='F')cnt++; else cnt--; if(!cnt) { int tim1=0,tim2=0,spa=0; for(int j=1;j<=20;j++) { if(!spa) { if(ch[fr][j]>='0'&&ch[fr][j]<='9') { tim1=10*tim1+ch[fr][j]-'0'; } if(ch[fr][j]=='n')tim1=1124; } if(tim1&&!spa&&ch[fr][j]==' ')spa=1; if(spa) { if(ch[fr][j]>='0'&&ch[fr][j]<='9') { tim2=10*tim2+ch[fr][j]-'0'; } if(ch[fr][j]=='n')tim2=1124; } if(tim2&&ch[fr][j]==' ')break; } if(tim1>tim2)continue; int tmp = dfs(fr+1,i-1); if(tim2==1124&&tim1!=1124)tmp++; ret=max(ret,tmp); fr=i+1; } } return ret; } void mk() { memset(use,0,sizeof use); memset(ch,'\0',sizeof ch); scanf("%d %s",&L,ch[0]+1); int len; tl=0; len = strlen(ch[0]+1); int f=0,s=0; for(int i=1;i<=len;i++) { if(ch[0][i]=='n')f=1; if(f&&ch[0][i]>='0'&&ch[0][i]<='9')s=10*s+ch[0][i]-'0'; } gets(ch[0]+1); for(int i=1;i<=L;i++) gets(ch[i]+1); if(!check()) { p3(); return ; } int ans = dfs(1,L); if(!ans&&!f){p1();return;} if(ans&&ans==s){p1();return;} p2(); } int main() { scanf("%d",&T); for(int i=1;i<=T;i++) mk(); return 0; }