1 条题解

  • 0
    @ 2025-8-24 21:36:51

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar Okimoto
    *  *

    搬运于2025-08-24 21:36:51,当前版本为作者最后更新于2020-09-21 18:18:09,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    P2366

    这道题的算法十分明显:字符串+模拟

    这道题难度不高,坑点几乎没有,居然是黄题


    Before AC

    这道题可以拆分成三个部分,

    1、输入

    这道题最好的输入库其实是<stdio.h><stdio.h>, 因为其中的scanf()scanf()函数自带的NegatedNegated ScansetScanset(黑名单字符集)功能是真的香。

    输入迎刃而解。

    char cx[32];
    char cy[32];
    scanf("%[^=]=%[^;];\n", cx, cy);
    string a = cx;
    string b = cy;
    

    2、字符串处理和变量赋值

    <string><string> 自带的大小比较适用于本体的字典序输出,故此使用此字符串库 大致的字符串处理过程就是

    1. 判断B表达式是一个数字类型还是变量名类型
    2. 若B表达式是和的形式,拆分取值求和。若B表达式是变量名类型,还需取值
    3. 将A存入数据结构

    PS:<map><map>是存储【变量标识符 - 变量值】键值对的理想数据结构

    3、按照变量标识符的字典序输出

    存一个stringstring 类型的数组,用来记录已有的变量名。 <algorithm><algorithm> 自带sort函数,自写cmp。

    bool cmp(string a, string b){
    	return a < b;
    }
    

    ForFor循环输出不解释。


    代码:

    // 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
    上传者