山东大学程序设计思维学习笔记实验2

A - 化学 (编译器选 GNU G++)

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

假设如上图,这个烷烃基有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
每组数据,输出一行,代表烷烃基的英文名


输入值
2
1 2
2 3
3 4
4 5
5 6
1 4
2 3
3 4
4 5
5 6
输出量
正己烷
3-甲基戊烷

**思路:**这个题实际上挺灵活的,首先肯定是个图的结构,那如何分辨不同的烷烃基?答案是看每个点的度。五种烷烃的其中三种都是可以直接通过查看度而确定的,如:n-hexane没有度大于二的点,2,2-dimethylbutane是唯一有度为四的点的烷烃…问题出在2-methylbutane和3-methylbutane上,这两者如果只看度,列一个数组,是完全一样的。所以观察度为三的点的临接点的度之和,发现不一样,所以只要找到哪些点是这些临接点再将其度加起来就行了。

//
// Created by haofeng on 3/6/20.
//所有下标为便于理解从1开始
//
#include <iostream>

using namespace std;
int degree[5];//多少度的点有多少个
int edges[5][2];//记录原始的各个边
int thedegrees[7];//原始的各点的度数
int main(){
   
    int T;scanf("%d",&T);
    for(int i=0;i<T;i++){
   
        for(int j=0;j<7;j++){
   
            thedegrees[j]=0;
        }
        for(int j=0;j<5;j++){
   
            degree[j]=0;
        }
        //以上初始化
        for(int j=0;j<5;j++){
   //对应点的度加上去
            scanf("%d",&edges[j][0]);
            scanf("%d",&edges[j][1]);
            thedegrees[edges[j][0]]++;
            thedegrees[edges[j][1]]++;
        }
        for(int j=1;j<=6;j++){
   //统一计算多少度的点有多少个
            //thedegrees[j]是第j点的度数
            degree[thedegrees[j]]++;
        }
        if(degree[2]==4){
   //第一种
            printf("n-hexane\n");
        } else if(degree[3]==2){
   //第四种
            printf("2,3-dimethylbutane\n");
        } else if (degree[4]==1){
   //第五种
            printf("2,2-dimethylbutane\n");
        }
        else{
   //开始判断第二种和第三种
            int v3=0,temp=0,advsum=0;
            int adv[3];
            for(int k=1;k<=6;k++){
   //找到度为三的点
                if(thedegrees[k]==3){
   v3=k;break;}
            }
            for(int k=0;k<5;k++){
   //统计和度为三的点相邻的点
                if(edges[k][0]==v3)adv[temp++]=edges[k][1];
                if(edges[k][1]==v3)adv[temp++]=edges[k][0];
            }
            for(int k=0;k<3;k++){
   
                advsum+=thedegrees[adv[k]];
                temp=0;
            }
            if(advsum==4)printf("2-methylpentane\n");
            else printf("3-methylpentane\n");
        }
    }
}

总结:实际上这个题方法很多,但往往不是思路想不出来,而是在一些小地方失误,比如打错单词(

B - 爆零(×)大力出奇迹(√)

程序设计思维作业和实验使用的实时评测系统,具有及时获得成绩排名的特点,那它的功能是怎么实现的呢?
我们千辛万苦怼完了不忍直视的程序并提交以后,评测系统要么返回AC,要么是返回各种其他的错误,不论是怎样的错法,它总会给你记上一笔,表明你曾经在这儿被坑过,而当你历经千辛终将它AC之后,它便会和你算笔总账,表明这题共错误提交了几次。
在岁月的长河中,你通过的题数虽然越来越多,但通过每题时你所共花去的时间(从最开始算起,直至通过题目时的这段时间)都会被记录下来,作为你曾经奋斗的痕迹。特别的,对于你通过的题目,你曾经的关于这题的每次错误提交都会被算上一定的单位时间罚时,这样一来,你在做出的题数上,可能领先别人很多,但是在做出同样题数的人中,你可能会因为罚时过高而处于排名上的劣势。
例如某次考试一共八道题(A,B,C,D,E,F,G,H),每个人做的题都在对应的题号下有个数量标记,负数表示该学生在该题上有过的错误提交次数但到现在还没有AC,正数表示AC所耗的时间,如果正数a跟上了一对括号,里面有个正数b,则表示该学生AC了这道题,耗去了时间a,同时曾经错误提交了b次。例子可见下方的样例输入与输出部分。

Input
输入数据包含多行,第一行是共有的题数n(1≤n≤12)以及单位罚时m(10≤m≤20),之后的每行数据描述一个学生的信息,首先是学生的用户名(不多于10个字符的字串)其次是所有n道题的得分现状,其描述采用问题描述中的数量标记的格式,见上面的表格。
Output
根据这些学生的得分现状,输出一个实时排名。实时排名显然先按AC题数的多少排,多的在前,再按时间分的多少排,少的在前,如果凑巧前两者都相等,则按名字的字典序排,小的在前。每个学生占一行,输出名字(10个字符宽),做出的题数(2个字符宽,右对齐)和时间分(4个字符宽,右对齐)。名字、题数和时间分相互之间有一个空格。数据保证可按要求的输出格式进行输出。

Sample Input
8 20
GuGuDong  96     -3    40(3) 0    0    1      -8    0
hrz       107    67    -3    0    0    82     0     0
TT        120(3)<
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值