您的位置:首页 > 其它

uva 586 Instant Complexity

2013-08-02 15:49 78 查看
点击打开链接uva 586

思路:递归模拟

分析:

1 题目是一道给定一段程序代码的球时间复杂度

2 根据题目的意思,我们可以利用栈和递归的方法,但是栈的方法比较不好写,所以我们利用递归的思路来写

3 当我们遇到LOOP的时候,我们就递归下去,当遇到OP的时候我们就去计算当前这一层的复杂度,遇到END的时间retuen即可

4 注意最后的输出

代码:

#include<vector>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;

const int MAXN = 15;

int ans[MAXN];
char str[MAXN];

void getAns(vector<string>v , int x){
int size = v.size();
int num_n = 0;
int num_xishu = x;
for(int i = 0 ; i < size ; i++){
int len = v[i].size();
if(v[i][0] == 'n')
num_n++;
else{
int sum = 0;
for(int j = 0 ; j < len ; j++)
sum = sum*10 + v[i][j]-'0';
num_xishu *= sum;
}
}
ans[num_n] += num_xishu;
}

void solve(vector<string>v){
int x;
while(1){
scanf("%s" , str);
if(str[0] == 'L'){
scanf("%s" , str);
v.push_back(str);
solve(v);
v.pop_back();
}
else if(str[0] == 'O'){
scanf("%d" , &x);
getAns(v , x);
}
else if(str[0] == 'E'){
return;
}
}
}

void output(){
printf("Runtime = ");
bool isFirst = true;
bool isTime = false;
for(int i = MAXN-1 ; i >= 1 ; i--){
if(ans[i]){
isTime = true;
if(isFirst)
isFirst = false;
else
printf("+");
if(ans[i] > 1)
printf("%d*" , ans[i]);
printf("n");
if(i > 1)
printf("^%d" , i);
}
}
if(ans[0]){
isTime = true;
if(!isFirst)
printf("+");
printf("%d" , ans[0]);
}
if(!isTime)
printf("0");
printf("\n\n");
}

int main(){
int Case , cas = 1;
vector<string>v;
scanf("%d" , &Case);
while(Case--){
scanf("%s" , str);
memset(ans , 0 , sizeof(ans));
printf("Program #%d\n" , cas++);
v.clear();
solve(v);
output();
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: