题目:化学
题目描述:
假设如上图,这个烷烃基有6个原子和5个化学键,6个原子分别标号1~6,然后用一对数字 a,b 表示原子a和原子b间有一个化学键。这样通过5行a,b可以描述一个烷烃基
你的任务是甄别烷烃基的类别。
输入:输入第一行为数据的组数T(1≤T≤200000)。每组数据有5行,每行是两个整数a, b(1≤a,b≤6,a ≤b)
数据保证,输入的烷烃基是以上5种之一~
输出:每组数据,输出一行,代表烷烃基的英文名~
解题思路:这是一个小模拟,解体在于找到上述5种烷烃基的不同点,通过这些不同点判别。首先可以通过原子连接的其他原子的最大的数目来判断出n-hexane,2,2-dimethybutane,2,3-dimethybutane,之后再根据那个特殊的原子连接的其他原子的连接数来判断出后两种。如3-methylpentane连接的又两个连接两个原子,而另外一个只有一个。
代码:
#include<iostream>
#include<algorithm>
#include<cstdlib>
#include<cstring>
#include<vector>
using namespace std;
int a[6];
int b[6];
int main()
{
int n,x,y;
cin>>n;
while(n--)
{
vector<pair<int,int> > h;
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
for(int i=0;i<5;i++)
{
cin>>x>>y;
a[x-1]++;
a[y-1]++;
b[x-1]++;
b[y-1]++;
h.push_back(make_pair(x-1,y-1));
}
sort(a,a+6);
if(a[5]==4)//先在这里判断3种
{
cout<<"2,2-dimethylbutane"<<endl;
continue;
}else if(a[5]==2)
{
cout<<"n-hexane"<<endl;
continue;
}else if(a[5]==a[4])
{
cout<<"2,3-dimethylbutane"<<endl;
continue;
}else//这里判断两种
{
int flag=0;
for(int i=0;i<5;i++)
{
if(b[h[i].first]==3)
{
if(b[h[i].second]==1)
{
flag++;
}
}
if(b[h[i].second]==3)
{
if(b[h[i].first]==1)
{
flag++;
}
}
}
if(flag==2)
{
cout<<"2-methylpentane"<<endl;
continue;
}else
{
cout<<"3-methylpentane"<<endl;
}
}
}
}