首页 > 其他 > 详细

程序设计思维与实践 Week2 实验 (1/2/智能班)

时间:2020-03-01 23:03:14      阅读:67      评论:0      收藏:0      [点我收藏+]

A - 化学


 

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

技术分享图片

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

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

 思想

观察发现每个点的度数大致不同,分别是

 

 

{1,1,1,2,2,3};{1,1,2,2,2,2}; {1,1,1,1,2,4}; {1,1,1,1,3,3};

除了methylpentane外,其他三个均不同,而2-methylpentane和3-methylpentane度数分布均为{1,1,1,2,2,3}。

所以只需要将每个点的度数求出来与度数数组对比,若为后三个则直接输出即可,若为第一个则需要进一步判断。

观察2-methylpentane和3-methylpentane发现2-m度数为3的点跟着两个度数为1的点,而3-m度数为3的点跟着两个度数为2的点。所以只需要找出度数为三的点关联的两个点的度数即可。

以下为全部代码:

技术分享图片
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
bool pd(int a[],int b[]){
    for(int i=0;i<=5;i++){
        if(a[i]!=b[i+1]) return false;
    }
    return true;
}
int main(){
    int a[6] = {1,1,1,2,2,3};
    int b[6] = {1,1,2,2,2,2};
    int c[6] = {1,1,1,1,2,4};
    int e[6] = {1,1,1,1,3,3};
    int z;
    cin>>z;
    while(z){
        z--;
        int d[7] = {0,0,0,0,0,0,0};
        pair<int,int> con[10];
        int ta,tb;
        for(int i=0;i<=4;i++){
            cin>>ta>>tb;
            d[ta]+=1;
            d[tb]+=1;
            con[2*i] = pair<int,int>(ta,tb);
            con[2*i+1] = pair<int,int>(tb,ta);
        }
        int q[7];
        for(int i=0;i<7;i++){
            q[i]=d[i];
        }
        sort(d+1,d+7);
        if(pd(a,d)){
            int tmp=0;
            int t[3];
            int j = 0;
            for(int i=1;i<=6;i++){
                if(q[i]==3){
                    tmp=i;
                    break;
                }
            }
            for(int i=0;i<10;i++){
                if(con[i].first==tmp){
                    t[j] = con[i].second;
                    j++;
                }
            }
            if(q[t[0]]+q[t[1]]+q[t[2]]==4){
                cout<<"2-methylpentane"<<endl;
            }
            else{
                cout<<"3-methylpentane"<<endl;
            }
        }
        if(pd(b,d)){
            cout<<"n-hexane"<<endl;
        }
        if(pd(c,d)){
            cout<<"2,2-dimethylbutane"<<endl;
        }
        if(pd(e,d)){
            cout<<"2,3-dimethylbutane"<<endl;
        }
    }
    return 0;
}
View Code

 

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) 30    10(1) -3   0    47     21(2) -2
OMRailgun 0      -99   -8    0    -666 -10086 0     -9999996
yjq       -2     37(2) 13    -1   0    113(2) 79(1) -1
Zjm       0      0     57(5) 0    0    99(3)  -7    0

Sample Output

TT          5  348
yjq         4  342
GuGuDong    3  197
hrz         3  256
Zjm         2  316
OMRailgun   0    0

思想

问题的关键在于数据的读取,匹配负号和括号即可。

采用结构体对每个学生进行存储,并利用堆存储,并重定义比较规则。

typedef struct tx{
    string name;
    int success;
    int lostime;
}tx;
struct cmp{
    bool operator()(tx &a,tx &c){
        if(a.success!=c.success) return (a.success)<(c.success)?true:false;
        else if(a.lostime!=c.lostime) return a.lostime>c.lostime?true:false;
        else return a.name>c.name?true:false;
    }
};

通过依次读取字符串,若没遇到‘(’则检测有无‘-’,若无,则+耗时,若有则ac-1,若遇到‘(’,则+耗时+单位罚时*括号内错误提交数。

以下为全部代码

技术分享图片
#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <string>
#include <queue>
#include <cmath>
using namespace std;
typedef struct tx{
    string name;
    int success;
    int lostime;
}tx;
struct cmp{
    bool operator()(tx &a,tx &c){
        if(a.success!=c.success) return (a.success)<(c.success)?true:false;
        else if(a.lostime!=c.lostime) return a.lostime>c.lostime?true:false;
        else return a.name>c.name?true:false;
    }
};
using namespace std;
int main(){
    int m,n;
//    freopen("test.txt","r",stdin);
    cin>>m>>n;
    string tmp;
    priority_queue<tx,vector<tx>,cmp> heap;
    tx t;
    while(cin>>tmp){
        t.name=tmp;
        t.lostime = 0;
        t.success = m;
        for(int i=0;i<m;i++){
            cin>>tmp;
            if(tmp.find(()==-1){
                if(tmp!="0"&&tmp.find(-)==-1){
                    int s = tmp.size();
                    for(int j=0;j<s;j++){
                        t.lostime+=(int(tmp[j])-48)*pow(10,s-j-1);
                    }
                }
                else{
                    t.success-=1;
                }
            }
            else{
                int s = tmp.find(();
                for(int j=0;j<s;j++){
                    t.lostime+=(int(tmp[j])-48)*pow(10,s-j-1);
                }
                int st = tmp.find());
                for(int j=s+1;j<st;j++){
                    t.lostime+=(int(tmp[j])-48)*pow(10,st-j-1)*n;
                }
            }
        }
        heap.push(t);
    }
    tx mm;
    while(heap.size()){
        mm = heap.top();
        printf("%-10s %2d %4d\n",mm.name.c_str(),mm.success,mm.lostime);
        heap.pop();
    }
    return 0;
}
View Code

 

C - 瑞神打牌 (不支持C++11,G++和C++编译器都试试提交哈)


 

瑞神HRZ因为疫情在家闲得无聊,同时他又非常厉害,所有的课对他来说都是水一水就能拿A+,所以他无聊,找来了另外三个人:咕咕东,腾神以及zjm来打牌(天下苦瑞神久矣)。
显然,牌局由四个人构成,围成一圈。我们称四个方向为北 东 南 西。对应的英文是North,East,South,West。游戏一共由一副扑克,也就是52张构成。开始,我们指定一位发牌员(东南西北中的一个,用英文首字母标识)开始发牌,发牌顺序为顺时针,发牌员第一个不发自己,而是发他的下一个人(顺时针的下一个人)。这样,每个人都会拿到13张牌。
现在我们定义牌的顺序,首先,花色是(梅花)<(方片)<(黑桃)<(红桃),(输入时,我们用C,D,S,H分别表示梅花,方片,黑桃,红桃,即其单词首字母)。对于牌面的值,我们规定2 < 3 < 4 < 5 < 6 < 7 < 8 < 9 < T < J < Q < K < A。
现在你作为上帝,你要从小到大排序每个人手中的牌,并按照给定格式输出。(具体格式见输出描述和样例输出)。

Input

输入包含多组数据
每组数据的第一行包含一个大写字符,表示发牌员是谁。如果该字符为‘#’则表示输入结束。
接下来有两行,每行有52个字符,表示了26张牌,两行加起来一共52张牌。每张牌都由两个字符组成,第一个字符表示花色,第二个字符表示数值。

Output

输出多组数据发牌的结果,每组数据之后需要额外多输出一个空行!!!!!
每组数据应该由24行的组成,输出按照顺时针方向,始终先输出South Player的结果,每位玩家先输出一行即玩家名称(东南西北),接下来五行,第一行和第五行输出固定格式(见样例),第二行和第四行按顺序和格式输出数值(见样例),第三行按顺序和格式输出花色(见样例)。

Sample Input

N
CTCAH8CJD4C6D9SQC7S5HAD2HJH9CKD3H6D6D7H3HQH4C5DKHKS9
SJDTS3S7S4C4CQHTSAH2D8DJSTSKS2H5D5DQDAH7C9S8C8S6C2C3
#

Sample Output

South player:
+---+---+---+---+---+---+---+---+---+---+---+---+---+
|6 6|A A|6 6|J J|5 5|6 6|7 7|9 9|4 4|5 5|7 7|9 9|T T|
| C | C | D | D | S | S | S | S | H | H | H | H | H |
|6 6|A A|6 6|J J|5 5|6 6|7 7|9 9|4 4|5 5|7 7|9 9|T T|
+---+---+---+---+---+---+---+---+---+---+---+---+---+
West player:
+---+---+---+---+---+---+---+---+---+---+---+---+---+
|2 2|5 5|9 9|K K|5 5|7 7|9 9|4 4|T T|J J|A A|8 8|A A|
| C | C | C | C | D | D | D | S | S | S | S | H | H |
|2 2|5 5|9 9|K K|5 5|7 7|9 9|4 4|T T|J J|A A|8 8|A A|
+---+---+---+---+---+---+---+---+---+---+---+---+---+
North player:
+---+---+---+---+---+---+---+---+---+---+---+---+---+
|3 3|4 4|J J|2 2|3 3|T T|Q Q|K K|8 8|Q Q|K K|2 2|3 3|
| C | C | C | D | D | D | D | D | S | S | S | H | H |
|3 3|4 4|J J|2 2|3 3|T T|Q Q|K K|8 8|Q Q|K K|2 2|3 3|
+---+---+---+---+---+---+---+---+---+---+---+---+---+
East player:
+---+---+---+---+---+---+---+---+---+---+---+---+---+
|7 7|8 8|T T|Q Q|4 4|8 8|A A|2 2|3 3|6 6|J J|Q Q|K K|
| C | C | C | C | D | D | D | S | S | H | H | H | H |
|7 7|8 8|T T|Q Q|4 4|8 8|A A|2 2|3 3|6 6|J J|Q Q|K K|
+---+---+---+---+---+---+---+---+---+---+---+---+---+

思想

定义poke结构体,利用堆并重定义比较规则。

typedef struct poke{
    char num;
    char hua;
    int tn;
    int th;
    poke(){}
    void set(char n,char m){
        this->num = n;
        this->hua = m;
        this->tn = ap[n];
        this->th = bp[m];
    }
}poke;
string out[4]={"North player:\n+---+---+---+---+---+---+---+---+---+---+---+---+---+\n","East player:\n+---+---+---+---+---+---+---+---+---+---+---+---+---+\n",
               "South player:\n+---+---+---+---+---+---+---+---+---+---+---+---+---+\n","West player:\n+---+---+---+---+---+---+---+---+---+---+---+---+---+\n"};
struct cmp{
    bool operator()(poke tca,poke tcb){
        if(tca.th!=tcb.th) return tca.th<tcb.th;
        else return tca.tn<tcb.tn;
    }
};

将输入存储到四个堆当中,然后按照相对顺序,找到south位置,进行输出即可。

错误:在提交时先是一直PE,自以为改完bug后又出现RE。RE是由于数组取余时用负数取余了,PE则是由于每次输出没有输出空格,最后输出时多了一行空格。

全部代码如下:

技术分享图片
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <string>
#include <queue>
#include <cmath>
#include <map>
using namespace std;
map<char,int> ap;
map<char,int> bp;
char a[13] = {2,3,4,5,6,7,8,9,T,J,Q,K,A};
char b[4] = {C,D,S,H};
typedef struct poke{
    char num;
    char hua;
    int tn;
    int th;
    poke(){}
    void set(char n,char m){
        this->num = n;
        this->hua = m;
        this->tn = ap[n];
        this->th = bp[m];
    }
}poke;
string out[4]={"North player:\n+---+---+---+---+---+---+---+---+---+---+---+---+---+\n","East player:\n+---+---+---+---+---+---+---+---+---+---+---+---+---+\n",
               "South player:\n+---+---+---+---+---+---+---+---+---+---+---+---+---+\n","West player:\n+---+---+---+---+---+---+---+---+---+---+---+---+---+\n"};
struct cmp{
    bool operator()(poke tca,poke tcb){
        if(tca.th!=tcb.th) return tca.th<tcb.th;
        else return tca.tn<tcb.tn;
    }
};
using namespace std;
int main(){
//    freopen("test.txt","r",stdin);
//    freopen("out.txt","w",stdout);
    for(int i=0;i<=12;i++){
        ap[a[i]] = i;
    }
    for(int i=0;i<=3;i++){
        bp[b[i]] = i;
    }
    priority_queue<poke,vector<poke>,cmp> q[4];
    poke cp[52];
    char cd;
    cin>>cd;
    while(cd!=#){
        int ouc = 0;
        if(cd==N) ouc = 0;
        else if(cd==E) ouc = 1;
        else if(cd==S) ouc = 2;
        else ouc = 3;
        char ta,tb;
        for(int i=0;i<=51;i++){
            cin>>ta>>tb;
            cp[i].set(tb,ta);
            q[i%4].push(cp[i]);
        }
        cin>>cd;
        char thua[13];
        char tnum[13];
        for(int j=0;j<=3;j++){
            for(int i=0;i<13;i++){
                int zb = (j+(1-ouc)+4)%4;
                tnum[i] = q[zb].top().num;
                thua[i] = q[zb].top().hua;
                q[zb].pop();
            }
            cout<<out[(2+j)%4];
            for(int i=0;i<13;i++){
                cout<<"|"<<tnum[12-i]<<" "<<tnum[12-i];
            }
            cout<<"|"<<endl;
            for(int i=0;i<13;i++){
                cout<<"| "<<thua[12-i]<<" ";
            }
            cout<<"|"<<endl;
            for(int i=0;i<13;i++){
                cout<<"|"<<tnum[12-i]<<" "<<tnum[12-i];
            }
            cout<<"|"<<endl;
            if(cd!=#||j<3) cout<<"+---+---+---+---+---+---+---+---+---+---+---+---+---+"<<endl;
            else cout<<"+---+---+---+---+---+---+---+---+---+---+---+---+---+";
        }

        if(cd!=#) cout<<endl;
    }
    return 0;
}
View Code

 

程序设计思维与实践 Week2 实验 (1/2/智能班)

原文:https://www.cnblogs.com/mopa/p/12391295.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!