PAT(A)Chemical Equation
题目链接:https://pintia.cn/problem-sets/1336189424478273536/problems/1336189514299293699
思路:大模拟 或者dfs做
dfs做的博客转载链接:https://blog.csdn.net/qq_52661062/article/details/114701346
坑点:要求输出的是元素的字典序最小而不是整个字符串最小,可以自定义一个排序解决
注意:sort的自定义排序返回值为期望的结果 例如:如果希望由小到大则 return l<r;
代码
#include<bits/stdc++.h>
using namespace std;
int a[1000]={0};
vector<int>b;
vector<string> ans[105];
bool check(string s){
int len=s.size();
int atm;
for(int i=0;i<len;i++){
if(s[i]=='-')break;
if(s[i]>='0'&&s[i]<='9'){
atm=(s[i]-'0')*10+(s[i+1]-'0');
if(a[atm]<=0)return false;
i++;
}
}
for(int i=0;i<len;i++){
if(s[i]=='-')break;
if(s[i]>='0'&&s[i]<='9'){
atm=(s[i]-'0')*10+(s[i+1]-'0');
// cout<<atm<<endl;
a[atm]--;
i++;
}
}
return true;
}
bool cmp(string l, string r){
int len=min(l.size()-5,r.size()-5);
for(int i=0;i<len;i++){
if(l[i]>r[i])return false;
}
return l.size()>r.size();
}
int main (){
int n;
cin>>n;
string atm;
int num;
for(int i=0;i<n;i++){
cin>>atm;
num=(atm[0]-'0')*10+(atm[1]-'0');
a[num]++;
}
int m;
cin>>m;
for(int i=0;i<m;i++){
cin>>atm;
num=(atm[0]-'0')*10+(atm[1]-'0');
b.push_back(num);
}
int k;
cin>>k;
int len;
getchar();
for(int i=0;i<k;i++){
getline(cin,atm);
//cout<<atm<<endl;
len=atm.size();
num=(atm[len-2]-'0')*10+(atm[len-1]-'0');
ans[num].push_back(atm);
}
for(int i=0;i<m;i++){
num=b[i];
atm=to_string(num/10)+to_string(num%10);
//cout<<atm<<endl;
ans[num].push_back(""+atm+" -> "+atm);
sort(ans[num].begin(),ans[num].end(),cmp);
for(int j=0;j<ans[num].size();j++){
//cout<<ans[num][j]<<endl;
if(check(ans[num][j])){
cout<<ans[num][j];
break;
}
}
//cout<<ans[num][0];
if(i!=m-1)cout<<endl;
}
return 0;
}

浙公网安备 33010602011771号