大模拟
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;
}
浙公网安备 33010602011771号