问题:
化学很神奇,以下是烷烃基。

假设如上图,这个烷烃基有6个原子和5个化学键,6个原子分别标号1~6,然后用一对数字 a,b 表示原子a和原子b间有一个化学键。这样通过5行a,b可以描述一个烷烃基
你的任务是甄别烷烃基的类别。
原子没有编号方法,比如
1 2
2 3
3 4
4 5
5 6
和
1 3
2 3
2 4
4 5
5 6
是同一种,本质上就是一条链,编号其实是没有关系的,可以在纸上画画就懂了
input:
输入第一行为数据的组数T(1≤T≤200000)。每组数据有5行,每行是两个整数a, b(1≤a,b≤6,a ≤b)
数据保证,输入的烷烃基是以上5种之一
output:
每组数据,输出一行,代表烷烃基的英文名
sample input:
2
1 2
2 3
3 4
4 5
5 6
1 4
2 3
3 4
4 5
5 6
sample output:
n-hexane
3-methylpentane
题解
- 判断方法:对于这五种分子,我是根据其原子的价位来进行判断的。我们观察这五种分子,第一个只有二价与一阶原子。第二种与第三种由一个三价原子,第四种有两个三价原子,第五种由四价原子,这样我们在每次输入的过程中将原子的价位的个数记录下来就可以分辨除二三之外的分子。第二三的区别在于两个三价原子是否相联,我们只需要将输入的五个化学键的两端记录下来,看看是否三价的两个是一次输入的。
完整代码
#include <iostream>
using namespace std;
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
int main(int argc, char** argv) {
int n;
cin>>n;
for(int i=0;i<n;i++)
{
int v[7]={0,0,0,0,0,0,0}; //记录六个原子的价位
int a[5],b[5];
for(int j=0;j<5;j++)
{
cin>>a[j]>>b[j];
v[a[j]]++; //将每个化学键的两端记录下来
v[b[j]]++;
}
int one,two,three,four;
one=0;
two=0;
three=0;
four=0;
for(int j=1;j<=6;j++) //统计个数
{
if(v[j]==1) one++;
if(v[j]==2) two++;
if(v[j]==3) three++;
if(v[j]==4) four++;
}
if(four==1) cout<<"2,2-dimethylbutane"<<endl;
if(three==0&&four==0) cout<<"n-hexane"<<endl;
if(three==2) cout<<"2,3-dimethylbutane"<<endl;
if(three==1)
{
int san,er1,er2,count=0;
for(int j=1;j<=6;j++)
{
if(v[j]==3)
{
san=j;
}
if(v[j]==2)
{
if(count==0)
{
er1=j;
count++;
}
else{
er2=j;
}
}
} // 将两个三价元素找出来
bool is=0;
for(int k=0;k<5;k++) //查看这两个三价元素是否为同一次输入
{
if((a[k]==er1&&b[k]==er2)||(a[k]==er2&&b[k]==er1))
{
is=1;
}
}
if(is)
{
cout<<"2-methylpentane"<<endl;
}
else
{
cout<<"3-methylpentane"<<endl;
}
}
}
return 0;
}
该博客介绍了一种算法来辨别烷烃基的类别,基于输入的化学键信息。通过分析原子的价位,可以确定烷烃基的英文名称。文章提供了样例输入和输出,并详细解释了判断方法。
6074

被折叠的 条评论
为什么被折叠?



