• Week2EXP2&HomeWork_SDUCS


    第一题:

    化学很神奇,以下是烷烃基

    假设如上图,这个烷烃基有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

    每组数据,输出一行,代表烷烃基的英文名

    思路分析:

    题目的本质是要我们区分化学中的同分异构体,我们知道同分异构体的本质区别是各个原子的连接方式不同,因此我们可以把每个原子看成一个节点,把化学键看成连接每个节点的边,计算每个节点的度数,按照不同的度数组合来区分各个同分异构体。

    我们根据观察n-hexane的每个原子度数为1、1、2、2、2、2。2,2-dimethylbutane为1、1、1、2、4,2,3-dimethylbutane为1、1、1、3、3,而2-methylpentane和3-methylpentane都是1、1、1、2、2、3。对于前三个,我们总是能够根据他们的度数序列进行正确区分,而后两个,则需要我们进一步区分,观察这两个同分异构体,我们发现他们度数为3的节点所连接的三个节点的度数是不同的(一个为1、1、2另一个为1、2、2),所以我们就可以根据这个进行区分。

    有了思路之后就可以写代码了,我们根据输入就可以统计出每个节点的度数(输入每出现一次该节点,就表示该节点的度数加一),由于每个节点地位相等,所以我们把收集的节点序列排序,然后送入分析节点序列的程序即可。

    一下为源代码(略为混乱....)

    #include<iostream>
    #include<algorithm>
    using namespace std;

    struct node{
    int a,b;
    };

    void fuc(){
    int count[7];
    int temp[7];
    for(int i=0;i<7;i++){
    count[i]=0;
    }

    node list[5];
    for(int i=0;i<5;i++){
    cin>>list[i].a>>list[i].b;
    count[list[i].a]++;
    count[list[i].b]++;
    }
    for(int i=0;i<7;i++){
    temp[i]=count[i];
    }
    /*
    for(int i=0;i<5;i++){
    cout<<list[i].a<<" "<<list[i].b<<endl;
    }

    */

    sort(count,count+7);
    // for(int i=1;i<=6;i++){
    // cout<<count[i]<<endl;
    // }
    if(count[6]==4){
    cout<<"2,2-dimethylbutane"<<endl;
    return;
    }
    if(count[3]==2){
    cout<<"n-hexane"<<endl;
    return;
    }
    if(count[5]==3){
    cout<<"2,3-dimethylbutane"<<endl;
    return;
    }
    int sum=0;
    // cout<<" "<<endl;
    // for(int i=1;i<=6;i++){
    // cout<<temp[i]<<endl;
    // }
    // cout<<endl;
    for(int i=1;i<=6;i++){
    if(temp[i]==3){
    // cout<<"i="<<i<<endl;
    for(int j=0;j<5;j++){
    if(list[j].a==i){
    // cout<<"j.a="<<j<<endl;
    sum=sum+temp[list[j].b];
    // cout<<sum<<endl;
    }
    if(list[j].b==i){
    // cout<<"j.b"<<j<<endl;
    sum=sum+temp[list[j].a];
    // cout<<sum<<endl;
    }
    }
    break;
    }
    }
    if(sum==5){
    cout<<"3-methylpentane"<<endl;
    return;
    }
    //cout<<sum<<endl;
    cout<<"2-methylpentane"<<endl;
    return;
    }

    int main(){
    int n;
    cin>>n;
    for(int i=0;i<n;i++){
    fuc();
    }
    }

  • 相关阅读:
    聊聊WS-Federation
    用双十一的故事串起碎片的网络协议(上)
    责任链模式的使用-Netty ChannelPipeline和Mina IoFilterChain分析
    最小化局部边际的合并聚类算法(中篇)
    最小化局部边际的合并聚类算法(上篇)
    UVaLive 7371 Triangle (水题,判矩形)
    UVaLive 7372 Excellence (水题,贪心)
    POJ 3312 Mahershalalhashbaz, Nebuchadnezzar, and Billy Bob Benjamin Go to the Regionals (水题,贪心)
    UVa 1252 Twenty Questions (状压DP+记忆化搜索)
    UVa 10817 Headmaster's Headache (状压DP+记忆化搜索)
  • 原文地址:https://www.cnblogs.com/Xu-SDU/p/12425752.html
Copyright © 2020-2023  润新知