标签:
| Time Limit: 1000MS | Memory Limit: 10000K | |
| Total Submissions: 1905 | Accepted: 657 |
Description
< Program > ::= "BEGIN" < Statementlist > "END" < Statementlist > ::= < Statement > | < Statement > < Statementlist > < Statement > ::= < LOOP-Statement > | < OP-Statement > < LOOP-Statement > ::= < LOOP-Header > < Statementlist > "END" < LOOP-Header > ::= "LOOP" < number > | "LOOP n" < OP-Statement > ::= "OP" < number >
Input
Output
Sample Input
2
BEGIN
LOOP n
OP 4
LOOP 3
LOOP n
OP 1
END
OP 2
END
OP 1
END
OP 17
END
BEGIN
OP 1997 LOOP n LOOP n OP 1 END END
END
Sample Output
Program #1 Runtime = 3*n^2+11*n+17 Program #2 Runtime = n^2+1997
Source
递归模拟即可 输出挺恶心。。死在乘号上了……
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
using namespace std;
int cn[111][11];
char str[111];
char tmp[111];
int tp;
void OutPut()
{
printf("Runtime = ");
int f = 0;
for(int i = 10; i >=0; --i)
{
if(!cn[0][i]) continue;
if(f) putchar('+');
else f = 1;
if(cn[0][i] != 1 || !i)
printf("%d",cn[0][i]);
if(cn[0][i] != 1 && i) putchar('*');
if(i > 1) printf("n^%d",i);
else if(i) putchar('n');
}
if(!f) printf("%d",f);
puts("");
puts("");
}
int ToNum(char *st)
{
int ans = 0;
for(int i = 0; st[i]; ++i)
{
ans = ans*10+st[i]-'0';
}
return ans;
}
void dfs()
{
int ans = 0;
int pre = tp++;
while(~scanf("%s",str) && str[0] != 'E')
{
if(str[0] == 'O')
{
int x;
scanf("%d",&x);
ans += x;
}
else
{
scanf("%s",tmp);
if(tmp[0] == 'n')
{
dfs();
for(int i = 10; i; --i) cn[tp][i] = cn[tp][i-1];
cn[tp][0] = 0;
}
else
{
int x = ToNum(tmp);
dfs();
for(int i = 0; i <= 10; ++i) cn[tp][i] *= x;
}
tp++;
}
}
for(int i = pre+1; i < tp; ++i)
for(int j = 0; j <= 10; ++j)
{
cn[pre][j] += cn[i][j];
cn[i][j] = 0;
}
tp = pre;
cn[pre][0] += ans;
}
int main()
{
freopen("in.in","r",stdin);
freopen("out.out","w",stdout);
int t;
scanf("%d",&t);
for(int z = 1; z <= t; ++z)
{
memset(cn,0,sizeof(cn));
scanf("%s",str);
tp = 0;
dfs();
printf("Program #%d\n",z);
OutPut();
}
return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:
原文地址:http://blog.csdn.net/challengerrumble/article/details/48827059