HDU - 3347 Calculate the expression — 模拟 + map存变量

  传送门

  题意:从输入开始,1.输入样例数;2.然后输入一组样例中的行数n;3.前n-1行为定义变量(之间使用空格隔开),只需要map存进去就可以了(这里有覆盖的情况,故使用mp["s"] = "***"的方法赋值,因为insert的方法如果里面存在的话,插不进入数值);4.然后就是最后一行输入计算式子(之间使用空格隔开)。

  思路:我使用的字符流的方法分割的的字符串,因为题中说了使用空格隔开的;

    变量的储存使用map就可以,在最后一行输入计算式子之后,同样使用字符流分割的方法,分割出来,判断是加法减法变量、数 字(正负)。   我做的时候就是以为都是加法,所以WA了一次。

 1 #include <iostream>
 2 #include <algorithm>
 3 #include <sstream>
 4 #include <string>
 5 #include <vector>
 6 #include <queue>
 7 #include <map>
 8
 9 #include <cstdio>
10 #include <cstring>
11 #include <cmath>
12 using namespace std;
13
14 // 讲字符串转换为数字(这里的函数名起得不合适)
15 long long asksum(string str, int s) {
16     int len = str.length();
17     long long sum = 0;
18     for (int i = s; i < len; ++i) {
19         sum = sum*10+(str[i]-‘0‘);
20         // cout << "qwe" << endl;
21     }
22     // cout << sum << "+++++" << endl;
23     if (s)
24         return sum*-1;
25     return sum;
26 }
27
28 int main() {
29     // ios::sync_with_stdio(false);
30     // cin.tie(NULL);
31     // cout.tie(NULL);
32
33     int t, n;
34     string str, s;
35     map<string, int> mp;
36     // 储存变量
37     cin >> t;
38     while (t--) {
39         cin >> n;
40         getchar();
41         mp.clear();
42         // 每一次清空上一次残留的变量
43         long long sum = 0;
44         for (int i = 0; i < n; ++i) {
45             getline(cin, str);
46             if (i == n-1) {    // 在输入计算式的时候直接出结果,也可以讲变量和计算式分开
47                 int flag = 1;
48                 // 这个flag就是用来标记是加法还是减法的。
49                 stringstream ss(str);
50                 while (ss >> s) {
51                     if (s[0] >= ‘0‘ && s[0] <= ‘9‘) {
52                         sum += asksum(s, 0)*flag;
53                         // cout << "+" << endl;
54                     } else if (s[0] == ‘-‘ && s[1] >= ‘0‘ && s[1] <= ‘9‘){
55                         sum += asksum(s, 1)*flag;
56                         // cout << "-" << endl;
57                     } else if (s == "+") {
58                         flag = 1;
59                     } else if (s == "-") {
60                         flag = -1;
61                     } else if (s[0] >= ‘a‘ && s[0] <= ‘z‘) {
62                         sum += mp[s]*flag;
63                     }
64                 }
65             } else {
66                 stringstream ss(str);
67                 string var;
68                 int num = 0, zhi;
69                 while (ss >> s) {
70                     num++;
71                     // 因为变量赋值只有三部分,所以这里只需要去第一次和第三次即可
72                     if (num == 1) {
73                         var = s;
74                     } else if (num == 3) {
75                         if (s[0] == ‘-‘)
76                             zhi = asksum(s, 1);
77                         else
78                             zhi = asksum(s, 0);
79                     }
80                 }
81                 mp[var] = zhi;
82             }
83             // cout << mp.size() << " = size" << endl;
84         }
85         // cout << "sum = " << sum << endl;
86         cout << sum << endl;
87     }
88
89     return 0;
90 }

hdu 3347

  关于字符串分流的知识点:字符串分割

时间: 2024-10-13 21:15:36

HDU - 3347 Calculate the expression — 模拟 + map存变量的相关文章

Hdu 3887树状数组+模拟栈

题目链接 Counting Offspring Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1757    Accepted Submission(s): 582 Problem Description You are given a tree, it’s root is p, and the node is numbered fr

HDU 4968 Improving the GPA 模拟

最小时就都当69,最大时都当85 .. #include <cstdio> #include <iostream> #include <algorithm> #include <string.h> #include <math.h> #include <vector> #include <map> #include <queue> using namespace std; #define N 5000 int

HDU 4925 Apple Tree(模拟题)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4925 解题报告:给你n*m的土地,现在对每一块土地有两种操作,最多只能在每块土地上进行两种操作,第一种是种苹果树操作,第二种是施肥操作,种苹果树操作可以使得该块地 长出一个苹果,施肥操作可以使得与这块土地相邻的土地的苹果产量变为原来的两倍,问可以得到的最多的苹果数量是多少? 例如一个4*4的土地,用1表示在该土地上做第一种操作,0表示在该土地上做第二种操作,可以得到最多苹果的操作如下: 0 1 0

hdu 4119 Isabella&#39;s Message 模拟题

Isabella's Message Time Limit: 20 Sec  Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=4119 Description Isabella and Steve are very good friends, and they often write letters to each other. They exchange funny experiences, talk ab

HDU 1034 Candy Sharing Game 模拟题

一个分糖游戏,找了会规律,没找到,只能直接模拟玩了. 果然0ms过了,看来数据不大,只是考编码能力罢了. #include <stdio.h> #include <vector> #include <string.h> #include <algorithm> #include <iostream> #include <string> #include <limits.h> #include <stack> #

hdu 4915 Parenthese sequence (贪心+模拟)

题目大意: 一个序列中有左括号和右括号,还有问号,问号可以任意转换成左右括号. 问这个序列有多少种情况的转变使得这个序列变成合法的括号匹配序列. 思路分析: 首先我们分析一下,如何使得一个序列是合法的括号匹配序列. 我们很容易想到的是用栈模拟匹配过程. 当遇到左括号就进栈,当遇到右括号就让栈顶的左括号出栈. 那么在模拟的过程中,造成这个序列的不合法的原因只有当右括号来的时候,此时的栈已经为空. 这里补充一句,一旦一个序列给定,那么这里面的问号有多少变成左括号,多少变成右括号,是一定的. 看完以上

POJ 3087 Shuffle&#39;m Up (模拟+map)

题目链接:http://poj.org/problem?id=3087 题目大意:已知两堆牌s1和s2的初始状态, 其牌数均为c,按给定规则能将他们相互交叉组合成一堆牌s12,再将s12的最底下的c块牌归为s1,最顶的c块牌归为s2,依此循环下去. 现在输入s1和s2的初始状态 以及 预想的最终状态s12.问s1 s2经过多少次洗牌之后,最终能达到状态s12,若永远不可能相同,则输出"-1". 解题思路:照着模拟就好了,只是判断是否永远不能达到状态s12需要用map,定义map<

hdu 4941 Magical Forest(STL map &amp; 结构体运用)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4941 Magical Forest Time Limit: 24000/12000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Total Submission(s): 220    Accepted Submission(s): 105 Problem Description There is a forest c

hdu 4891 The Great Pan(模拟)

题目链接:hdu 4891 The Great Pan 题目大意:给出一个文本,问说有多少种理解方式. 1. $$中间的,(s1+1) * (s2+1) * ...*(sn+1), si表示连续的空格数. 2.{}中间,即 | 的个数+1. 解题思路:模拟. #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int maxn = 1<<22