题解
2026-01-02 20:57:50
发布于:浙江
11阅读
0回复
0点赞
这打磨你有点恶心
题目意思很明了,不多赘述
思路:
打磨你。大模拟。根据题意进行模拟即可。使用 map 可以事半功倍。注意类似 的变量名。
代码:
#include <bits/stdc++.h>
using namespace std;
int t;
map<string,int> mp;
int read(){
int x=0,f=1;
int ch=getchar();
while(ch<'0' or ch>'9'){
if(ch=='-')f=-1;
ch=getchar();
}while(ch>='0' and ch<='9'){
x=(x<<1)+(x<<3)+(ch^48);
ch=getchar();
}return x*f;
}
void write(long long x){
if(x==0){
putchar('0');
return ;
}
if(x<0){
putchar('-');
x=-x;
}if(x>9)write(x/10);
putchar(x%10+'0');
}
int check(string a){//判断为哪一种情况。加法表达式,变量赋值或数赋值
int l=a.size()-1;
for(int i=0;i<=l;i++){
if(a[i]=='+')return 1;
}for(int i=0;i<=l;i++){
if(!(a[i]>='0' and a[i]<='9'))return 2;
}
return 0;
}int f(string a){//字符串转数
int sum=0;
for (int i=0; i<a.size();i++) {
sum=sum*10+(a[i]-'0');
}
return sum;
}
int main(){
t=read();
for(int i=1;i<=t;i++){
string n;
cin >> n;
n=n.substr(0,n.size()-1);
int l=n.find('=');
string a=n.substr(0,l),b=n.substr(l+1);// a 为当前被赋值的变量名,b 为 a 的赋值式子
if(check(b)==0){//数赋值
mp[a]=f(b);
}else if(check(b)==1){//加法赋值
int l,r;
int p=b.find('+');
string x=b.substr(0,p),y=b.substr(p+1);
if(check(x)==0)l=f(x);//
else{
if(mp.find(x)!=mp.end())l=mp[x];
else l=0;
}if(check(y)==0)r=f(y);
else{
if(mp.find(y)!=mp.end())r=mp[y];
else r=0;
}mp[a]=l+r;
}else{//变量赋值
if(mp.find(b)!=mp.end())mp[a]=mp[b];
else mp[a]=0;
}
}
for (auto it=mp.begin();it!=mp.end();it++) {
cout << it->first << " " ;
write(it->second);
cout << endl;
}
return 0;
}
番外
#include<bits/stdc++.h>
using namespace std;
long long n;
string a;
map<string,int> mp;
int pdsz(string s){
stringstream ans;
ans<<s;
int b;
ans>>b;
return b;
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>n;
for(int t=1;t<=n;t++){
cin>>a;
int cnt=0;
string name;
for(int i=0;i<a.size();i++){
if(a[i]=='='){
cnt=i;
break;
}
name+=a[i];
}
int aaa=0;
for(int i=cnt+1;i<a.size();i++){
if(a[i]=='+'){
aaa=1;
break;
}
}
if(aaa){
string A;
int cnt1=0;
for(int i=cnt+1;i<a.size();i++){
if(a[i]=='+'){
cnt1=i;
break;
}
A+=a[i];
}
string B;
for(int i=cnt1+1;i<a.size()-1;i++){
B+=a[i];
}
//cout<<A<<" "<<B;//测试
//cout<<name<<" ";
if(isdigit(B[0])&&isdigit(A[0])){
mp[name]=pdsz(B)+pdsz(A);
}
else if(isdigit(A[0])!=1&&isdigit(B[0])!=1){
mp[name]=mp[A]+mp[B];
}
else if(isdigit(A[0])&&isdigit(B[0])!=1){
mp[name]=mp[A]+pdsz(B);
}
else if(isdigit(B[0])&&isdigit(A[0])!=1){
mp[name]=mp[B]+pdsz(A);
}
}
else{
string aa;
for(int i=cnt+1;i<a.size()-1;i++){
aa+=a[i];
}
if(isdigit(aa[0])){
mp[name]=pdsz(aa);
}
else{
mp[name]=mp[aa];
}
}
}
for(auto& i:mp){
cout<<i.first<<" "<<i.second<<endl;
}
}
全部评论 3
shi山只是对自己代码的谦辞而已
真的比起可读性与逻辑,我的代码应该也不比别人的差多少(dalao别喷)
并且我的代码从思路上更简便,便于理解
因为我的代码的特殊思路,所以不会被“a1”“aaa”这类卡掉2026-01-02 来自 重庆
1我来阅读一下
2026-01-02 来自 浙江
0似乎和我的思路差不多
2026-01-02 来自 浙江
0但是我感觉你的代码在处理加法的时候有点过于复杂
2026-01-02 来自 浙江
0
@++c吧蛋滚
品鉴一下,谁的代码好一点(2026-01-02 来自 浙江
1
2026-01-02 来自 重庆
0
d
2026-01-02 来自 浙江
0










有帮助,赞一个