POJ 1472 Instant Complexity(模拟时间复杂度)

题目点击->这里

大概题意是: 
模拟时间复杂度
LOOP为开始一个循环且LOOP后面只能跟数字或者n,即循环n次或任意次(比如LOOP 5,就是循环5次)
OP为操作次数,OP后面只跟数字(比如 OP 5就是做5次操作)
END为结束当前循环

大概思路是:
用一个栈存住每一次LOOP循环次数 , 比如LOOP n , 就将n入栈 , 遇到END , 就出栈 (由于栈先进后出的特性会让第一个循环在最后结束),然后用一个BOOK数组存n^i的系数,用nn(有几个n)和num(LOOP 有数字)来维护当前处于第几层循环。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<stack>
using namespace std;
#define sd(n) scanf("%d",&n)
#define sdd(n,m) scanf("%d%d",&n,&m)
#define sddd(n,m,k) scanf("%d%d%d",&n,&m,&k)
#define pd(n) printf("%d\n", (n))
#define pdd(n,m) printf("%d %d\n", n, m)
#define pld(n) printf("%lld\n", n)
#define pldd(n,m) printf("%lld %lld\n", n, m)
#define sld(n) scanf("%lld",&n)
#define sldd(n,m) scanf("%lld%lld",&n,&m)
#define slddd(n,m,k) scanf("%lld%lld%lld",&n,&m,&k)
#define sf(n) scanf("%lf",&n)
#define sff(n,m) scanf("%lf%lf",&n,&m)
#define sfff(n,m,k) scanf("%lf%lf%lf",&n,&m,&k)
#define rep(i,a,n) for (int i=a;i<=n;i++)
#define per(i,n,a) for (int i=n;i>=a;i--)
#define mm(a,n) memset(a, n, sizeof(a))
#define read std::ios::sync_with_stdio(false)
typedef long long ll;
ll pow(ll n){
    ll ans = 1;
    for(ll i = 0 ; i < n ; i ++){
        ans *= 10;
    }
    return ans;
}
ll change(string a){
    ll ans = 0;
    ll len = a.size();
    for(ll i = 0 ; i < len ; i ++){
        ans += (a[i]-'0')*pow(len-i-1);
    }
    return ans;
}
ll book[20];
int main(){
    ll t;
    while(cin >> t){
    ll ok = t;
    while(t -){
        stack<string>q;
        memset(book,0,sizeof(book));
        char temp[20];
        cin >> temp;
        getchar();
        char value[20];
        ll num = 1 , nn = 0;
        int ling = 0;
        while(cin >> temp){
            if(temp[0] == 'E'){
                if(q.empty())break;
                string t = q.top();
                q.pop();
                if(t[0] == 'n')nn--;
                else{
                    ll tt = change(t);
                    if(tt == 0)ling--;
                    else num /= tt;
                }
            }
            else if(temp[0] == 'L'){
                cin >> value;
                if(value[0] == 'n'){
                    nn++;
                    q.push("n");
                }
                else{
                    ll t = change(value);
                    if(t == 0)ling++;
                    else num *= t;
                    q.push(value);
                }
            }

            else if(temp[0] == 'O'){
                cin >> value;
                ll tt = change(value);
                if(ling == 0)
                   book[nn] += tt*num;
            }
            getchar();
        }

        bool flag = false;
        cout << "Program #" << (ok-t) << endl << "Runtime = ";
        for(ll i = 12 ; i >= 2 ; i --){
            if(book[i] == 0)continue;
            if(flag)cout << "+";
            if(book[i] != 1)cout << book[i]<<"*";
            cout << "n^" << i;
            flag = true;
        }
        if(book[1] != 0){
            if(flag)cout << "+";
            if(book[1] != 1)cout << book[1]<<"*";
            cout << "n";
            flag = true;
        }
        if(book[0] != 0){
            if(flag)cout << "+";
            cout << book[0];
            flag = true;
        }

        if(!flag)cout << "0";
        cout << endl << endl;
    }
    }
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值