zoukankan      html  css  js  c++  java
  • 【例题 6-3 UVA

    【链接】 我是链接,点我呀:)
    【题意】

    在这里输入题意

    【题解】

    用栈来处理一下表达式就好。 因为括号是一定匹配的。所以简单很多。 a*b x b*c会做a*b*c次乘法。

    【代码】

    #include<bits/stdc++.h>
    #define ll long long
    using namespace std;
    
    const int N = 26;
    
    int n;
    char s[5];
    pair <ll, ll> v[300],v1[300];
    stack <char> sta;
    
    string cl(string s)
    {
    	for (int i = 'A'; i <= 'Z'; i++) v[i] = v1[i];
    	if (s[0] != '(') return "0";
    	int len = s.size();
    	ll ans = 0;
    	while (!sta.empty()) sta.pop();
    	for (int i = 0; i < len; i++)
    	{
    		if (s[i] == '(')
    		{
    			sta.push(s[i]);
    		}else
    			if (s[i] == ')')
    			{
    				char b = sta.top();
    				sta.pop();
    				char a = sta.top();
    				sta.pop();
    				sta.pop();//'('删掉
    				ll x = v[a].first, y = v[a].second,z = v[b].second;
    				if (y != v[b].first) return "error";
    				ans += x*y*z;
    				v[a].first = x, v[a].second = z;
    				sta.push(a);
    			}
    			else
    			{
    				sta.push(s[i]);
    			}
    	}
    	string temp = "";
    	while (ans)
    	{
    		temp = char(ans % 10 +'0')+ temp;
    		ans /= 10;
    	}
    	return temp;
    }
    
    int main()
    {
    	//freopen("F:\rush.txt", "r", stdin);
    	scanf("%d", &n);
    	for (int i = 1; i <= n; i++)
    	{
    		scanf("%s", s);
    		int x, y;
    		scanf("%d%d", &x, &y);
    		v[s[0]] = { x,y };
    	}
    	for (int i = 'A'; i <= 'Z'; i++) v1[i] = v[i];
    	string s;
    	while (cin >> s) cout << cl(s) << endl;
    	return 0;
    }
    
  • 相关阅读:
    Codevs 4633 [Mz]树链剖分练习
    Codevs 2460 == BZOJ 1036 树的统计
    洛谷 P1038 神经网络
    POJ 1062 昂贵的聘礼
    POJ 1459 Power Network
    POJ 1149 PIGS
    Codevs 1993 草地排水
    指针与引用
    江哥的DP题(G)
    江哥的DP题(F)
  • 原文地址:https://www.cnblogs.com/AWCXV/p/7693460.html
Copyright © 2011-2022 走看看