POJ 1472 Instant Complexity
又是模拟啊!!!!!
题目大意:
给出一段程序,只有一个“BEGIN”在第一行作为程序的开始,对应在程序的结尾有一个“END”,程序内部有“LOOP”(循环)和“OP”(语句),每一个“OP”后带一个常数,表示“OP”执行几次,每一个“LOOP”对应一个“END”,在“LOOP”到“END”范围内的语句都要循环执行“LOOP”后面的数字的次数,这个数字有可能是常数,有可能是变量“n”。
题目要求计算时间复杂度。
下面是代码:
#include <stdio.h> int Ntoi(char* s) { int n=0; for(int i=0; s[i]; i++) n=n*10+(s[i]-'0'); return n; } bool dfs(int* z) { char s[30]; scanf("%s",s); if(s[0]=='E') { return false; } else if(s[0]=='B') { while(dfs(z)); } else if(s[0]=='O') { scanf("%s",s); z[0]+=Ntoi(s); return dfs(z); } else { int tz[11]= {0}; scanf("%s",s); while(dfs(tz)); if(s[0]=='n') { for(int i=10; i>0; i--) tz[i]=tz[i-1]; tz[0]=0; } else { int x=Ntoi(s); for(int i=0; i<11; i++) { tz[i]*=x; } } for(int i=0; i<11; i++) z[i]+=tz[i]; } return true; } int main() { int T,cut=0; scanf("%d",&T); while(T--) { cut++; int z[11]= {0},i; dfs(z); printf("Program #%d\n",cut); printf("Runtime = "); bool t=false,flat=false; for(i=10; i>=0; i--) { if(i==0&&z[i]) { if(flat) { printf("+"); flat=false; } printf("%d",z[i]); t=true; break; } if(z[i]) { if(flat) { printf("+"); flat=false; } t=true; if(z[i]>1) { printf("%d",z[i]); } flat=true; if(i>1) { if(z[i]>1) { printf("*"); } printf("n^%d",i); } else if(i==1) { if(z[i]>1) { printf("*"); } printf("n"); } } } if(t) { printf("\n\n"); } else { printf("0\n\n"); } } return 0; }