大模拟

A.Amino Acids

题解:挺好玩的大模拟,化学知识得到了提升,属于那种看懂题就能做的类型,平时写得太少导致赛时出锅。

#include<bits/stdc++.h>
using namespace std;

const int N = 105;
map<string,int> mmap;
int num[] = {0,89,132,133,121,146,147,75,149,105,119};
string s[N];
int _min = 10000000;
vector<string> vec[N];
string t1 = "  H H O    ";
string t2 = "  | | ||   ";
string t3 = "H-N-C-C-O-H";
string t4 = "    |      ";
string t5 = "  H-C-H    ";
string t6 = "  O=C-O-H  ";
string t7 = "    H      ";
string t8 = "      |    ";
string t9 = "      H    ";
string t10= "    S      ";
string t11= "  H-C-S-H  ";
string t12= "           ";
string t13= "  H-C-O-H  ";
string t14= "  O=C-N-H  ";
int n,sz;
void f(){
  for(int i=1;i<=10;i++){
    vec[i].push_back(t1);vec[i].push_back(t2);vec[i].push_back(t3);vec[i].push_back(t4);
  }
  vec[1].push_back(t5);vec[3].push_back(t5);
  vec[2].push_back(t5);vec[8].push_back(t5);
  vec[5].push_back(t5);vec[6].push_back(t5);

  vec[1].push_back(t4);vec[1].push_back(t7);
  vec[3].push_back(t4);vec[3].push_back(t6);
  vec[2].push_back(t4);vec[2].push_back(t14);vec[2].push_back(t8);vec[2].push_back(t9);
  vec[4].push_back(t11);vec[4].push_back(t4);vec[4].push_back(t7);
  vec[7].push_back(t7);
  vec[9].push_back(t13);vec[9].push_back(t4);vec[9].push_back(t7);
  vec[8].push_back(t4);vec[8].push_back(t5);vec[8].push_back(t4);vec[8].push_back(t10);
  vec[8].push_back(t4);vec[8].push_back(t5);vec[8].push_back(t4);vec[8].push_back(t7);
  vec[10].push_back(t13);vec[10].push_back(t4);vec[10].push_back(t5);vec[10].push_back(t4);
  vec[10].push_back(t7);
  vec[5].push_back(t4);vec[5].push_back(t5);vec[5].push_back(t4);
  vec[5].push_back(t14);vec[5].push_back(t8);vec[5].push_back(t9);
  vec[6].push_back(t4);vec[6].push_back(t5);
  vec[6].push_back(t4);vec[6].push_back(t6);
}
vector<int> a;
vector<int> res;
int ans = 0;
void print(int n){
  int _max = 0;
  for(int i=0;i<n;i++){
    _max = max(_max,(int)vec[res[i]].size());
  }
  for(int i=0;i<_max;i++){
    if(i==2)
      for(int j=0;j<n;j++){
        int l = 0, r = vec[res[j]][i].size()-1;
        l++;r-=3;
        if(j==0)l--;if(j==n-1)r+=3;
        if(j!=0)cout << "-";
        for(int k = l;k<=r;k++)cout << vec[res[j]][i][k];
      }
    else {
      for(int j=0;j<n;j++){
        int l = 0;int r;
        if(vec[res[j]].size() > i)r = vec[res[j]][i].size()-1;
        l+=2;r--;
        if(j==0)l-=2;
        if(j==n-1)r++;
//if(res[j]==7)cout << vec[res[j]].size() << " " << i << endl;
        if(vec[res[j]].size() <= i){
          r = 9;
          for(int k=l;k<=r;k++)cout << " ";
        }
        else for(int k=l;k<=r;k++)cout << vec[res[j]][i][k];
      }
    }
    cout << endl;
  }
  cout << endl;
}

void dfs2(int cur,int sum){
  if(sum > sz)return; 
  if(cur>=2){
    ans++;
  }
  //if(cur==n)return;
  for(int i=0;i<n;i++){
    if(cur==0)dfs2(cur+1,sum+num[a[i]]);
    else dfs2(cur+1,sum+num[a[i]]-18);
  }
  return;
}

void dfs(int cur,int sum){
  if(sum > sz)return; 
  if(cur>=2){
    print(cur);
  }
  //if(cur==n)return;
  for(int i=0;i<n;i++){
    res.push_back(a[i]);
    if(cur==0)dfs(cur+1,sum+num[a[i]]);
    else dfs(cur+1,sum+num[a[i]]-18);
    res.pop_back();
  }
  return;
}

int main(){
  ios::sync_with_stdio(false);
  cin.tie(0);cout.tie(0);
  f();
//cout << vec[7].size() << endl;
  mmap["Ala"] = 1;
  mmap["Asn"] = 2;
  mmap["Asp"] = 3;
  mmap["Cys"] = 4;  
  mmap["Gln"] = 5;
  mmap["Glu"] = 6;
  mmap["Gly"] = 7;
  mmap["Met"] = 8;     
  mmap["Ser"] = 9;
  mmap["Thr"] = 10;
  cin >> n >> sz;
  for(int i=1;i<=n;i++){
    string s;cin >> s;
    a.push_back(mmap[s]);
  }
//   for(int i=0;i<n;i++){
//     for(auto it:vec[a[i]]){
//       cout << it << endl;
//     }
//     cout << endl;
//   }
  sort(a.begin(),a.end());
  dfs2(0,0);
  cout << ans << endl;
  dfs(0,0);
  return 0;
}
posted @ 2022-05-03 20:45  mafengfa  阅读(84)  评论(0)    收藏  举报