专栏文章

题解:P14305 【MX-J27-T2】转换

P14305题解参与者 3已保存评论 3

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
3 条
当前快照
1 份
快照标识符
@mini9bo8
此快照首次捕获于
2025/12/02 02:51
3 个月前
此快照最后确认于
2025/12/02 02:51
3 个月前
查看原文

题目传送门

思路

大模拟,分三步即可。

,\texttt , 运算符

这一步很简单,因为 ,\texttt , 优先级最低,所以答案只要取最后一个逗号右边的表达式的值就可以了。

*\texttt * 运算符

先做一步预处理,把符号和类型区分开来。注意要保存一下每一个 *\texttt * 的位置。
因为符号数量是类型数量减一,所以直接存储 *\texttt * 在符号中的下标即可。
接下来,为了去除 *\texttt *,显然要计算,通过题意,推导出 char,bool<int<longlong<float<double\texttt {char}, \texttt {bool} < \texttt {int} < \texttt {longlong} < \texttt {float} < \texttt {double}。就可以写出计算函数了,而且运算不分 +,*\texttt +, \texttt *
因为刚才存储了 *\texttt * 的位置,把第 ii*\texttt * 下标记作 mulimul_i,则去除这个 *\texttt * 应当计算第 mulimul_imuli+1mul_{i + 1} 的运算值。
注意:原本是由 +\texttt + 连接的类型也应保留。

+\texttt + 运算符

这时候,序列中的所有类型都由 +\texttt + 连接,只需要把每个数都计算一遍,输出答案即可。

AC CDOE

CPP
#include <bits/stdc++.h>
using namespace std;
string add_mul(string a, string b) { //计算
	if (a == "double" || b == "double") {
		return "double";
	}
	if (a == "float" || b == "float") {
		return "float";
	}
	if (a == "longlong" || b == "longlong") {
		return "longlong";
	}
	return "int";
}
int main() {
	int c, t;
	cin >> c >> t;
	while (t--) {
		string s;
		cin >> s;
		string k = "";
		for (int i = 0; i < s.size(); i++) { //去除 ,
			if (s[i] == ',') {
				k = "";
				continue;
			}
			k += s[i];
		}
		vector <int> mul;
		vector <string> a;
		string tmp = "";
		int cnt = 0;
		for (int i = 0; i < k.size(); i++) { //分离符号和类型
			if (k[i] == '+' || k[i] == '*') {
				a.push_back(tmp);
				tmp = "";
				if (k[i] == '*') {
					mul.push_back(cnt); //只用保留 * 的位置,其余的默认为 +
				}
				cnt++;
			} else {
				tmp += k[i];
			}
		}
		a.push_back(tmp);
		vector <string> b;
		int start = 0;
		for (int i = 0; i < mul.size(); i++) { //去除 *
			for (int j = start; j < mul[i]; j++) { //把不用计算的存起来
				b.push_back(a[j]);
			}
			start = mul[i] + 2; //记得下标
			b.push_back(add_mul(a[mul[i]], a[mul[i] + 1]));
		}
		for (int i = start; i < a.size(); i++) {
			b.push_back(a[i]);
		}
		string ans = b[0];
		for (int i = 1; i < b.size(); i++) {
			ans = add_mul(ans, b[i]); //计算最终答案
		}
		cout << ans << endl;
	}
	return 0;
}

评论

3 条评论,欢迎与作者交流。

正在加载评论...