一二三四五 上山打老虎

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;
}
posted @ 2021-03-12 19:54  黒川川  阅读(75)  评论(0)    收藏  举报