1 条题解
-
0
自动搬运
来自洛谷,原作者为

Okimoto
* *搬运于
2025-08-24 21:36:51,当前版本为作者最后更新于2020-09-21 18:18:09,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
P2366
这道题的算法十分明显:字符串+模拟
这道题难度不高,坑点几乎没有,
居然是黄题。
Before AC
这道题可以拆分成三个部分,
1、输入
这道题最好的输入库其实是, 因为其中的函数自带的 (黑名单字符集)功能是真的香。
输入迎刃而解。
char cx[32]; char cy[32]; scanf("%[^=]=%[^;];\n", cx, cy); string a = cx; string b = cy;2、字符串处理和变量赋值
自带的大小比较适用于本体的字典序输出,故此使用此字符串库 大致的字符串处理过程就是
- 判断B表达式是一个数字类型还是变量名类型
- 若B表达式是和的形式,拆分取值求和。若B表达式是变量名类型,还需取值
- 将A存入数据结构
PS:是存储【变量标识符 - 变量值】键值对的理想数据结构
3、按照变量标识符的字典序输出
存一个 类型的数组,用来记录已有的变量名。 自带sort函数,自写cmp。
bool cmp(string a, string b){ return a < b; }循环输出不解释。
代码:
// By Sublime Text 3 // P2366, by Okimoto // No copy, pls. #include <stdio.h> // 标准输入输出 #include <map> // STL大法好b( ̄▽ ̄)d #include <string> // 用string是因为string自带定义大小排序 #include <algorithm> // Sort using namespace std; int n; map <string, int> mp; // 存输入的信息和数 string ans[128]; // 存储已输入的变量标识符 + 字典序排序 int ptr = 0; // ans的末尾下标记录变量,同时也是ans的长度 bool cmp(string a, string b){ return a < b; // 字典序 } int main(int argc, char const *argv[]){ mp.insert(mp.begin(), pair<string, int>("__NULL__", 0)); // 对于a = b + c的代码处理a = b的情况时,将c假定成0 scanf("%d\n", &n); // 输入n for(int i = 0; i < n; ++ i){ char aa[32]; char bb[32]; scanf("%[^=]=", aa); // 输入直到遇见‘=’为止,顺便刷掉‘=’字符 string a = aa; scanf("%[^;];\n", bb); // 刷掉‘;’ + 刷掉换行符 string b = bb; if('0' <= b[0] && b[0] <= '9'){ // 若b变量是个数字类型的 int sum = 0; // ‘+’字符之前的数 int tmp = 0; // ‘+’字符之后的数 int j; // 取sum for(j = 0; j < (int)b.size() && b[j] != '+'; j ++){ sum *= 10; sum += b[j] - '0'; } // 取tmp for(j = j + 1; j < (int)b.size(); j ++){ tmp *= 10; tmp += b[j] - '0'; } sum += tmp; if(mp.end() == mp.find(a)){ // 若a变量还未在mp中 ans[ptr ++] = a; // ans记录a mp.insert(mp.begin(), pair<string, int>(a, sum)); // 将a推入mp } else mp[a] = sum; // 否则,将a的值改变 } else{ // b变量是个变量类型的 string x; // ‘+’字符之前的变量名 string y; // ‘+’字符之后的变量名 bool yFlg = true; // 判断是否没有‘+’以后的变量 int j; // 取x for(j = 0; j < (int)b.size() && b[j] != '+'; j ++) x += b[j]; // 取y for(j = j + 1; j < (int)b.size(); j ++){ yFlg = false; y += b[j]; } if(yFlg) y = "__NULL__"; // 取数 int sum = mp[x] + mp[y]; //同理 if(mp.end() == mp.find(a)){ ans[ptr ++] = a; mp.insert(mp.end(), pair<string, int>(a, sum)); } else mp[a] = sum; } } // 字典序排序 sort(ans, ans + ptr, cmp); // 输出 for(int i = 0; i < ptr; i ++) printf("%s %d\n", ans[i].c_str(), mp[ans[i]]); return 0; } // 谢谢大家阅读这篇题解,(づ ̄3 ̄)づ╭❤~
- 1
信息
- ID
- 1376
- 时间
- 1000ms
- 内存
- 125MiB
- 难度
- 3
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者