程序设计思维与实践第二次实验

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
每组数据,输出一行,代表烷烃基的英文名

Example
Input

2
1 2
2 3
3 4
4 5
5 6
1 4
2 3
3 4
4 5
5 6

Output
n-hexane
3-methylpentane

//根据5组原子序号,放在数组中,可以尝试写出每个烷烃的矩阵,能发现一些规律
//n-hexane 矩阵中每列元素的个数不超过2
//3-methylpentane 矩阵中有一列的元素有三个,元素所在列的元素个数之和为1
//2-methylpentane 矩阵中有一列元素有三个,元素所在列的元素个数之和为2
//2,3-dimethylbutane 矩阵中有2列元素个数和是三个
//2,2-dimethylbutane 矩阵中有1列元素个数和是四个

#include <iostream>
#include<cstdio>
#include<string.h>
using namespace std; 
int main(int argc, char** argv) {
 int n;
 scanf("%d",&n);//输入数据的组数
 while(n--){
  int a[7];//定义一个一维数组,用来统计每列数据的个数
  int array[7][7];//定义一个二维数组来,确定两个原子之间是否有化学键
  memset(a,0,sizeof(int)*7);//对一维数组初始化
  memset(array,0,sizeof(int)*49);//初始化
  for(int i=0;i<5;i++){
   int x,y;
   scanf("%d %d",&x,&y);
   array[x][y]=1;//记录化学键
   array[y][x]=1;
  }
  for(int i=1;i<7;i++){
   for(int j=1;j<7;j++){
    if(array[i][j]!=0) a[i]++;//记录每行的数据
   }
  }
  int p=0,q=0;
  for(int i=1;i<7;i++)
  {
   if(a[i]==3){
    p++;
   }
   if(a[i]==4) q++;
  }
  if(p==0&&q==0) printf("n-hexane\n");
  if(p==1){
   int j; 
   for(j=0;j<7;j++){
    if(a[j]==3) break;
   }
   int jud=0;
   for(int i=1;i<7;i++)
   {
    if(array[j][i]!=0&&a[i]==1) jud++;
   }
   if(jud==1) printf("3-methylpentane\n");
   if(jud==2) printf("2-methylpentane\n");
  }
   if(p==2) printf("2,3-dimethylbutane\n");
   if(q==1) printf("2,2-dimethylbutane\n");
  }
   return 0}

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
//每次输入一个人的信息进行处理,定义一个结构体,来
//保存每个人的姓名,对的题数,做对题目所用的时间,
//利用algorithm函数库对所有输入的人进行排序
#include <iostream>
#include <cstdio>
#include<string>
#include<algorithm> 
#include <iomanip>
using namespace std;
struct P{
 string name;//姓名
 int x,time;//对的题数,时间
 bool operator <(const P ch){
  if(x!=ch.x) return x>ch.x;//降序排列 
  else if(time!=ch.time) return time<ch.time;//升序排列 
  else return name<ch.name;//升序排列 
 }
};
int main(int argc, char** argv) {
 P *array=new P[100005];//人数不知道,开了一个比较大的数组
 int n,m;//输入题数和单位罚时
 cin>>n>>m;
 int i=0;
 while(cin>>array[i].name){//先输入名字
  for(int j=0;j<n;j++){
   string xx;//对成绩用字符串输入
   cin>>xx;
   if(xx[0]!='-'&&xx[0]!='0'){//如果成绩不是负数而且不是0
    array[i].x++;//正确的题数加1
    int sum1=0,sum2=0,z;//计算时间
    for(z=0;z<xx.size();z++){
     if(xx[z]!='(') {
      sum1=sum1*10+(int)(xx[z]-'0');//把string类型转化为int类型 
      //sum1:通过的时间
      //cout<<"1 "<<sum1<<endl;
     }
     else break;
    }
    for(int zz=z+1;zz<xx.size();zz++){
     if(xx[zz]!=')') {
      sum2=sum2*10+(int)(xx[zz]-'0');//ac的同时,错误的次数
     // cout<<"2 "<<sum2;
     }
     else break;
    }
    array[i].time=array[i].time+sum1+sum2*m; //总时间
   
   } 
  }
  i++;
 }
 sort(array,array+i);
 for(int s=0;s<i;s++) {//在输出中既包含左对齐又包含右对齐 
  cout<<left<<setw(10)<<array[s].name;//左对齐
  cout<<" "<<right<<setw(2)<<array[s].x;//右对齐
  cout<<" "<<right<<setw(4)<<array[s].time<<endl;
 }
 delete []array;
 return 0;
}

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
SJDTS3S7S4C4CQHTSAH2D8DJSTKS2H5D5DQDAH7C9S8C8S6C2C3
#

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 | Sd 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|
+---+---+---+---+---+---+---+---+---+---+---+---+---+
//定义一个结构体,来保存每张牌的花色,牌的数字,
//花色对应的数值,牌的数字对应的数字,利用
//algorithm 函数库对关键字排序,然后输出大小
#include<iostream>
#include<cstdio>
#include<string>
#include<map> 
#include<algorithm> 
using namespace std;

struct P{
 char a1,b1;//花色、数字
 int a2,b2;//花色、数字在map中对应的value值
 bool operator <(const P ch){
  if(a2!=ch.a2) return a2<ch.a2;//先花色升序排列
  else return b2<ch.b2;//后数字升序排列
 }
};
int main() {
 char nn;
 map<char,int> hs;//花色
 map<char,int> num;//数字 
 hs[char('C')]=1;//按照花色,给出相应的value值
 hs[char('D')]=2;
 hs[char('S')]=3;
 hs[char('H')]=4;
 num[char('2')]=0;//按照牌的数字的大小,给出相应的value值
 num[char('3')]=1;
 num[char('4')]=2;
 num[char('5')]=3;
 nu/m[char('6')]=4;
 num[char('7')]=5;
 num[char('8')]=6;
 num[char('9')]=7;
 num[char('T')]=8;
 num[char('J')]=9;
 num[char('Q')]=10;
 num[char('K')]=11;
 num[char('A')]=12;
 int pc=0;
 while(cin>>nn){//顺时针北,东,南,西 
  pc++;//计算发了几次牌
  if(nn=='#') break;
  P *n=new P[13];//为每个人的牌,建立数组
  P *s=new P[13];
  P *e=new P[13];
  P *w=new P[13];
  //string xxx;
  char xx[104];//记录输入的发牌信息
  for(int i=0;i<104;i++){
   char al;
   cin>>al;
   if(al=='\n') continue;//遇到换行,继续执行
   else xx[i]=al; 
  }
   if(nn=='N'){//从北边开始发牌
   int p=0,q=0;
   while(p<104){
    e[q].a1=xx[p++];
    e[q].b1=xx[p++];
    s[q].a1=xx[p++];
    s[q].b1=xx[p++];
    w[q].a1=xx[p++];
    w[q].b1=xx[p++];
    n[q].a1=xx[p++];
    n[q].b1=xx[p++];
    q++;
   }
  }
  if(nn=='E'){//从东边开始发牌
   int p=0,q=0;
   while(p<104){
   
    s[q].a1=xx[p++];
    s[q].b1=xx[p++];
    w[q].a1=xx[p++];
    w[q].b1=xx[p++];
    n[q].a1=xx[p++];
    n[q].b1=xx[p++];
    e[q].a1=xx[p++];
    e[q].b1=xx[p++];
    q++;
   }
  }
  if(nn=='S'){//从南边发牌
   int p=0,q=0;
   while(p<104){
    
    w[q].a1=xx[p++];
    w[q].b1=xx[p++];
    n[q].a1=xx[p++];
    n[q].b1=xx[p++];
    e[q].a1=xx[p++];
    e[q].b1=xx[p++];
    s[q].a1=xx[p++];
    s[q].b1=xx[p++];
    q++;
   }
  }
  if(nn=='W'){//从西边发牌
   int p=0,q=0;
   while(p<104){
    n[q].a1=xx[p++];
    n[q].b1=xx[p++];
    e[q].a1=xx[p++];
    e[q].b1=xx[p++];
    s[q].a1=xx[p++];
    s[q].b1=xx[p++];
    w[q].a1=xx[p++];
    w[q].b1=xx[p++];
    q++;
   }
  }
  for(int i=0;i<13;i++){
   n[i].a2=hs[n[i].a1];//把a1,b1对应的value值保存在相应的位置
   n[i].b2=num[n[i].b1];
   e[i].a2=hs[e[i].a1];
   e[i].b2=num[e[i].b1];
   s[i].a2=hs[s[i].a1];
   s[i].b2=num[s[i].b1];
   w[i].a2=hs[w[i].a1];
   w[i].b2=num[w[i].b1];
  }
  sort(n,n+13);//排序
  sort(e,e+13);
  sort(s,s+13);
  sort(w,w+13);
  if(pc!=1) cout<<endl;
  cout<<"South player:"<<endl;//无论怎么发牌,要从南边开始输出
  cout<<"+---+---+---+---+---+---+---+---+---+---+---+---+---+"<<endl; 
  cout<<"|";
  for(int i=0;i<13;i++){
   cout<<s[i].b1<<" "<<s[i].b1<<"|";
  }
  cout<<endl;
  cout<<"|";
  for(int i=0;i<13;i++){
   cout<<" "<<s[i].a1<<" "<<"|";
  }
  cout<<endl;
  cout<<"|";
  for(int i=0;i<13;i++){
   cout<<s[i].b1<<" "<<s[i].b1<<"|";
  }
  cout<<endl;
  cout<<"+---+---+---+---+---+---+---+---+---+---+---+---+---+"<<endl;
  cout<<"West player:"<<endl;
  cout<<"+---+---+---+---+---+---+---+---+---+---+---+---+---+"<<endl; 
  cout<<"|";
  for(int i=0;i<13;i++){
   cout<<w[i].b1<<" "<<w[i].b1<<"|";
  }
  cout<<endl;
  cout<<"|";
  for(int i=0;i<13;i++){
   cout<<" "<<w[i].a1<<" "<<"|";
  }
  cout<<endl;
  cout<<"|";
  for(int i=0;i<13;i++){
   cout<<w[i].b1<<" "<<w[i].b1<<"|";
  }
  cout<<endl;
  cout<<"+---+---+---+---+---+---+---+---+---+---+---+---+---+"<<endl;
  cout<<"North player:"<<endl;
  cout<<"+---+---+---+---+---+---+---+---+---+---+---+---+---+"<<endl; 
  cout<<"|";
  for(int i=0;i<13;i++){
   cout<<n[i].b1<<" "<<n[i].b1<<"|";
  }
  cout<<endl;
  cout<<"|";
  for(int i=0;i<13;i++){
   cout<<" "<<n[i].a1<<" "<<"|";
  }
  cout<<endl;
  cout<<"|";
  for(int i=0;i<13;i++){
   cout<<n[i].b1<<" "<<n[i].b1<<"|";
  }
  cout<<endl;
  cout<<"+---+---+---+---+---+---+---+---+---+---+---+---+---+"<<endl;
  cout<<"East player:"<<endl;
  cout<<"+---+---+---+---+---+---+---+---+---+---+---+---+---+"<<endl; 
  cout<<"|";
  for(int i=0;i<13;i++){
   cout<<e[i].b1<<" "<<e[i].b1<<"|";
  }
  cout<<endl;
  cout<<"|";
  for(int i=0;i<13;i++){
   cout<<" "<<e[i].a1<<" "<<"|";
  }
  cout<<endl;
  cout<<"|";
  for(int i=0;i<13;i++){
   cout<<e[i].b1<<" "<<e[i].b1<<"|";
  }
  cout<<endl;
  cout<<"+---+---+---+---+---+---+---+---+---+---+---+---+---+"<<endl;
  delete []w;
  delete []e;
  delete []n;
  delete []s;
    }
 
 
 return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值