欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Week2 实验

程序员文章站 2022-07-12 14:57:30
...

A-化学

题目

化学很神奇,以下是烷烃基。
Week2 实验
假设如上图,这个烷烃基有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

做法

将烷烃的化学式看作图,可以根据节点的度数分情况求解。比如只有n-hexane节点度数最大是2,就可以用数组a记录度数,sort排序找到最大度数,就可以把n-hexane和2,2-dimethybutane找到,而2,3-dimethylbutane最大度数节点有两个都是3,也可以区分。剩下的2-methylpentane和3-methylpentane可以根据最大度数节点相邻的节点度数判断,这时需要一个数组b来还原原来的节点度数,数组c来记录节点序号(确定相邻节点的序号是多少)。

代码

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

int main()
{
	int T;
	cin>>T;
	for(int i=0;i<T;i++)
	{
		int a[7],c[11],ii=0;//a度数,c序号 
		for(int j=0;j<7;j++)
		 a[j]=0;
		for(int j=0;j<5;j++)
		{
			int t1,t2;
			cin>>t1>>t2;
			a[t1]++;
			a[t2]++;
			c[ii++]=t1;
			c[ii++]=t2;
		}
		int b[7];
		for(int j=0;j<7;j++)
		{
			b[j]=a[j];
		}
		sort(a+1,a+7);
		
		if(a[6]==2)
		 cout<<"n-hexane"<<endl;
		else if(a[6]==4)
		 cout<<"2,2-dimethylbutane"<<endl;
		else if(a[6]==3&&a[5]==3)
		 cout<<"2,3-dimethylbutane"<<endl;
		else if(a[6]==3&&a[5]!=3)
		{
			int k=1,left;right;
			while(b[k]!=3) k++;
			int bb=0; 
			for(int kk=0;kk<10;kk++)
			{
				if(c[kk]==k)
				{
					if(kk%2==0)
					{
						if(b[c[kk+1]]==1)
						bb++;
					}
					else if(kk%2==1)
					{
						if(b[c[kk-1]]==1)
						bb++;
					}
				}
			}
			if(bb==2)
			cout<<"2-methylpentane"<<endl;
			else
			cout<<"3-methylpentane"<<endl;
		}
	}
	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

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

做法

用一个结构体stu储存每个学生的姓名name、解题数num、耗时tim,需要另外写一个排序函数cmp实现排名(用姓名首字母排序时用到ASCII码,涉及到大小写转换)。主函数中用结构体stu数组x保存学生信息,根据正数的个数得到解题数num,根据罚时规则计算总时长得到耗时tim,我这里是按字符格式一个一个的读入,用if else筛选括号来计算的,比较麻烦,可以换成sscanf。需要注意最后输出对齐格式。

代码

#include<iostream>
#include<algorithm>
#include<iomanip>
#include<string.h> 
using namespace std;

struct stu
{
	char name[20];
	int num;
	int tim;
}; 

bool cmd(stu a,stu b)
{
	if(a.num!=b.num) return a.num>b.num;
	else if(a.num==b.num) return a.tim<b.tim;
	else if(a.num==b.num&&a.tim==b.tim) 
	{
		if(a.name[0]>=65&&a.name[0]<=90&&b.name[0]>=97&&b.name[0]<=122)
		return (a.name[0]+32)<b.name[0];
		else if(b.name[0]>=65&&b.name[0]<=90&&a.name[0]>=97&&a.name[0]<=122)
		return (b.name[0]+32)<a.name[0];
		else return a.name[0]<b.name[0];
	}
}

int main()
{
	int n,m;
	cin>>n>>m;
	stu x[1009];
	int i=0;
	while(cin>>x[i].name)
	{
		x[i].tim=0;
		x[i].num=n;
		for(int j=0;j<n;j++)
		{
			char score[10];
			cin>>score;
			int t1=0,t2=0;
			for(int k=0;k<strlen(score);k++)
			{
				if(score[0]=='0'||score[0]=='-')
				{
					x[i].num--;
				    break;
			    }
				else if(score[k]=='(')
				{
					k++;
					for(k;score[k]!=')';k++)
					{
						t2=t2*10+(score[k]-'0');
					}
					break;
				}
				else if(score[k]>=48&&score[k]<=57)
				{
					t1=t1*10+(score[k]-'0');
				}	
			}	
			x[i].tim=x[i].tim+t1+t2*m;
		}
		i++;
	}
	sort(x,x+i,cmd);
	for(int ii=0;ii<i;ii++)
	{
		cout<<std::left<<setw(10)<<x[ii].name<<' ';
		cout<<std::right<<setw(2)<<x[ii].num<<' ';
		cout<<std::right<<setw(4)<<x[ii].tim<<endl;
	}
	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
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|
+---+---+---+---+---+---+---+---+---+---+---+---+---+

做法

用结构体card保存牌的花色大小,可以用map把char映射为int型,结构体card数组N、E、S、W保存每位玩家发到的牌。用char型数组c将牌的顺序先保存下来,再根据发牌员把牌按序分配给W、E、N、S方位的玩家,这里用到if else语句确定先给哪位玩家分配。sort排序后,按格式输出即可。

代码

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

map<char, int, less<char>, allocator<pair<const char,int> > >   col,fig;
struct card
{
	char color;
	char figure;
	bool operator < (const card &x) const
  {
	if(col[x.color]==col[color])
	 return fig[figure]<fig[x.figure];
	else
	 return col[color]<col[x.color];
   }
};



int main()
{
    col['C']=1;col['D']=2;col['S']=3;col['H']=4;
	fig['2']=1;fig['3']=2;fig['4']=3;fig['5']=4;fig['6']=5;fig['7']=6;fig['8']=7;fig['9']=8;fig['T']=9;fig['J']=10;fig['Q']=11;fig['K']=12;fig['A']=13;
	char fis;
	cin>>fis;
	while(fis!='#')
	{
		card N[20],E[20],S[20],W[20];
		char c[109];
		for(int i=0;i<104;i++)
		  cin>>c[i];
		if(fis=='N')
		{
			int j=0;
			for(int i=0;i<13;i++)
			{
				E[i].color=c[j++];
				E[i].figure=c[j++];
				S[i].color=c[j++];
				S[i].figure=c[j++];
				W[i].color=c[j++];
				W[i].figure=c[j++];
				N[i].color=c[j++];
				N[i].figure=c[j++];
			}
		}
		else if(fis=='E')
		{
			int j=0;
			for(int i=0;i<13;i++)
			{
				S[i].color=c[j++];
				S[i].figure=c[j++];
				W[i].color=c[j++];
				W[i].figure=c[j++];
				N[i].color=c[j++];
				N[i].figure=c[j++];
				E[i].color=c[j++];
				E[i].figure=c[j++];
			}
		}
		else if(fis=='S')
		{
			int j=0;
			for(int i=0;i<13;i++)
			{
				W[i].color=c[j++];
				W[i].figure=c[j++];
				N[i].color=c[j++];
				N[i].figure=c[j++];
				E[i].color=c[j++];
				E[i].figure=c[j++];
				S[i].color=c[j++];
				S[i].figure=c[j++];
		    }
	    }
	    else if(fis=='W')
		{
			int j=0;
			for(int i=0;i<13;i++)
			{	
				N[i].color=c[j++];
				N[i].figure=c[j++];
				E[i].color=c[j++];
				E[i].figure=c[j++];
				S[i].color=c[j++];
				S[i].figure=c[j++];
				W[i].color=c[j++];
				W[i].figure=c[j++];
		    }
	    }
		
		sort(E,E+13);
		sort(S,S+13);
		sort(W,W+13);
		sort(N,N+13);
		cout<<"South player:"<<endl;
		cout<<"+---+---+---+---+---+---+---+---+---+---+---+---+---+"<<endl; 
		for(int i=0;i<13;i++)
		{
		   cout<<'|'<<S[i].figure<<' '<<S[i].figure;
	    }
	    cout<<'|'<<endl;
	    for(int i=0;i<13;i++)
	    {
	    	cout<<'|'<<' '<<S[i].color<<' ';
		}
		cout<<'|'<<endl;
		for(int i=0;i<13;i++)
		{
		   cout<<'|'<<S[i].figure<<' '<<S[i].figure;
	    }
	    cout<<'|'<<endl;
	    cout<<"+---+---+---+---+---+---+---+---+---+---+---+---+---+"<<endl;
	    
	    
	    cout<<"West player:"<<endl;
		cout<<"+---+---+---+---+---+---+---+---+---+---+---+---+---+"<<endl; 
		for(int i=0;i<13;i++)
		{
		   cout<<'|'<<W[i].figure<<' '<<W[i].figure;
	    }
	    cout<<'|'<<endl;
	    for(int i=0;i<13;i++)
	    {
	    	cout<<'|'<<' '<<W[i].color<<' ';
		}
		cout<<'|'<<endl;
		for(int i=0;i<13;i++)
		{
		   cout<<'|'<<W[i].figure<<' '<<W[i].figure;
	    }
	    cout<<'|'<<endl;
	    cout<<"+---+---+---+---+---+---+---+---+---+---+---+---+---+"<<endl;
	    
	    
		cout<<"North player:"<<endl;
		cout<<"+---+---+---+---+---+---+---+---+---+---+---+---+---+"<<endl; 
		for(int i=0;i<13;i++)
		{
		   cout<<'|'<<N[i].figure<<' '<<N[i].figure;
	    }
	    cout<<'|'<<endl;
	    for(int i=0;i<13;i++)
	    {
	    	cout<<'|'<<' '<<N[i].color<<' ';
		}
		cout<<'|'<<endl;
		for(int i=0;i<13;i++)
		{
		   cout<<'|'<<N[i].figure<<' '<<N[i].figure;
	    }
	    cout<<'|'<<endl;
	    cout<<"+---+---+---+---+---+---+---+---+---+---+---+---+---+"<<endl;
	    
	    cout<<"East player:"<<endl;
		cout<<"+---+---+---+---+---+---+---+---+---+---+---+---+---+"<<endl; 
		for(int i=0;i<13;i++)
		{
		   cout<<'|'<<E[i].figure<<' '<<E[i].figure;
	    }
	    cout<<'|'<<endl;
	    for(int i=0;i<13;i++)
	    {
	    	cout<<'|'<<' '<<E[i].color<<' ';
		}
		cout<<'|'<<endl;
		for(int i=0;i<13;i++)
		{
		   cout<<'|'<<E[i].figure<<' '<<E[i].figure;
	    }
	    cout<<'|'<<endl;
	    cout<<"+---+---+---+---+---+---+---+---+---+---+---+---+---+"<<endl<<endl;
	    
	    
	    
		cin>>fis; 
	}
}