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

程序设计模拟题【Week2】

程序员文章站 2022-04-07 09:03: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-hex”原子与一个化学键相连的有2个,与两个化学键相连的有4个。
同理可以求出“2-methy”有3个一键,1个三键,2个双键,“3-methy”和“2-methy”一样,“2,-3dime”有4个一键,2个三键,“2-2dim”有4个一键,1个四键,1个双键。
用a[5],b[5]来处理输入,然后遍历a,b数组,用yuan[]来记录每个原子与几个键相连接,对应于yuan[a[i]]++,Yuan[b[i]]++.
然后再遍历yuan数组,用jian[]来记录,从1-4键分别有多少个,对应于(if(yuan[i]==1)jian[1]++.
在判断“2类”“3类”的时候要注意,先找到拥有3键的元素的位置记为mid,然后在遍历a,b数组,如果a[k]==next并且b[k]!=next则sum++,最后判断sum的值就可以了

代码:

#include <iostream>
#include <stack>
#include<algorithm>
using namespace std;
long long int t;
int yuan[7];//用来记录每个原子有多少键

int main()
{
	cin >> t;
	while (t--)
	{
		int a[5], b[5];
		int jian[5] = { 0,0,0,0,0 };
		int yuan[7] = { 0,0,0,0,0,0,0 };
		for (int i = 0; i < 5; i++)
			cin >> a[i] >> b[i];
		for (int i = 0; i < 5; i++)
		{
			yuan[a[i]]++;
			yuan[b[i]]++;
		}
		/*for (int i = 1; i < 7; i++)
			cout << yuan[i] << " ";
		cout << endl;*/
		for (int i = 1; i <= 6; i++)
		{
			if (yuan[i] == 1)	jian[1]++;
			else if (yuan[i] == 2)	jian[2]++;
			else if (yuan[i] == 3)	jian[3]++;
			else if (yuan[i] == 4)	jian[4]++;
		}
		//开始判断
		if (jian[1] == 2 && jian[2] == 4)
		{
			cout << "n-hexane" << endl;
			continue;
		}
		else if (jian[1] == 4 && jian[3] == 2)
		{
			cout << "2,3-dimethylbutane" << endl;
			continue;
		}
		else if (jian[1] == 4 && jian[2] == 1 && jian[4] == 1)
		{
			cout << "2,2-dimethylbutane" << endl;
			continue;
		}
		else
		{//开始判断2类,3类
			/*for (int i = 1; i <= 6; i++)
				cout << yuan[i] << " ";
			cout << endl;*/
			int mid = 0;
			int sum=0;
			for (int i = 1; i <= 6; i++)
			{
				if (yuan[i] == 3)
				{
					mid = i;
					break;
				}
			}
			for (int j = 0; j < 5; j++)
			{
				int next;
				if (a[j] == mid || b[j] == mid)
				{
					if (a[j] == mid)	next = b[j];
					else next = a[j];
					for (int k = 0; k < 5; k++)
						if ((a[k] == next && b[k] != mid) || (b[k] == next && a[k] != mid))
						{
							sum++;
							break;
						}
				}
			}
			if (sum == 2)	cout << "3-methylpentane" << endl;
			else if (sum == 1)	cout << "2-methylpentane" << endl;
		}
		
		
	}
}



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

思路:这道题思路不复杂,复杂在于要处理输入数据。
用了结构体来处理,结构体里(名字,每个题目的分数,答对的题数,以及消耗的时间)

总结:这道题中使用了“std::npos”以及ctr.(),以及对齐方式这下setw(x),向左对齐std::left,向对齐std::right

代码:

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

int n, m;
struct student
{
	string name;
	string* score = new string[13];
	int ans;
	int time;
}p[10000];

bool cmp(const student& p1, const student& p2)
{
	if (p1.ans > p2.ans)	return true;
	else if (p1.ans < p2.ans)	return false;
	else
	{
		if (p1.time < p2.time)	return true;
		else if (p1.time > p2.time)	return false;
		else
		{
			if (p1.name <= p2.name)	return true;
			else	return false;
		}
	}
}

int main()
{
	cin >> n >> m;
	int sum = 0;	//总人数 
	while (cin >> p[sum].name)
	{
		for (int i = 0; i < n; i++)
		{
			cin >> p[sum].score[i];
			if (p[sum].score[i] > "0")	//答对题 
			{
				p[sum].ans++;
				//处理时间
				if (p[sum].score[i].find("(") == string::npos)	//无()
					p[sum].time += atoi(p[sum].score[i].c_str());
				else	
				{//含有括号
					//处理括号以前的时间
					int thistime = 0;	
					int index = 0;
					for (; index < p[sum].score[i].size(); index++)
					{
						if (p[sum].score[i].at(index) == '(')	break;
						else thistime = thistime * 10 + p[sum].score[i].at(index) - '0';
					}
					p[sum].time += thistime;
					//处理括号以内的时间
					int ttime = 0;	
					for (; index < p[sum].score[i].size(); index++)
					{
						if (p[sum].score[i].at(index) == '(')	continue;
						else if (p[sum].score[i].at(index) == ')')	break;
						else ttime = ttime * 10 + p[sum].score[i].at(index) - '0';
					}
					p[sum].time += ttime * m;
				}
			}
		}
		sum++;
	}
	sort(p, p + sum, cmp);
	for (int i = 0; i < sum; i++)
	{
		cout << std::left << setw(10) << p[i].name << " " << std::right << setw(2) << p[i].ans << " " << std::right << setw(4) << p[i].time << endl;
	}
}

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|
+---+---+---+---+---+---+---+---+---+---+---+---+---+

思路:这道题和B题有点像,哭哭处理数据好难呀,同样用结构体来解决问题。

代码:

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

map<char, int> mp;
struct card
{
	char huase;//CDSH=>1234
	char zhi;
};
struct people
{
	char name;
	card theCard[13];
	int theIndex;
} p[4];


bool cmp(const card& c1, const card& c2)
{
	if (mp[c1.huase] < mp[c2.huase])	return true;
	else if (mp[c1.huase] > mp[c2.huase])	return false;
	else
	{
		if (mp[c1.zhi] < mp[c2.zhi])	return true;
		else 	return false;
	}
}
int main()
{
	mp['C'] = 1, mp['D'] = 2, mp['S'] = 3, mp['H'] = 4, mp['2'] = 5, mp['3'] = 6, mp['4'] = 7, mp['5'] = 8,
		mp['6'] = 9, mp['7'] = 10, mp['8'] = 11, mp['9'] = 12, mp['T'] = 13, mp['J'] = 14, mp['Q'] = 15,
		mp['K'] = 16, mp['A'] = 17;
	p[0].name = 'N', p[1].name = 'E', p[2].name = 'S', p[3].name = 'W';
	while (1)
	{
		char fapai;
		cin >> fapai;
		if (fapai == '#')	break;
		int index;
		if (fapai == 'N')	index = 1;
		else if (fapai == 'E')	index = 2;
		else if (fapai == 'S')	index = 3;
		else if (fapai == 'W')	index = 0;
		p[0].theIndex = 0, p[1].theIndex = 0, p[2].theIndex = 0, p[3].theIndex = 0;
		for (int i = 0; i < 52; i++)
		{
			//发牌
			char a, b;
			cin >> a >> b;
			card theCard;
			theCard.huase = a, theCard.zhi = b;
			p[index].theCard[p[index].theIndex] = theCard;
			p[index].theIndex++;
			index = (index + 1) % 4;
		}
		//排序
		for (int i = 0; i < 4; i++)
			sort(p[i].theCard, p[i].theCard + 13, cmp);
		cout << "South player:" << endl;
		cout << "+---+---+---+---+---+---+---+---+---+---+---+---+---+" << endl;
		for (int i = 0; i < 13; i++)
			cout << "|" << p[2].theCard[i].zhi << " " << p[2].theCard[i].zhi;
		cout << "|" << endl;
		for (int i = 0; i < 13; i++)
			cout << "| " << p[2].theCard[i].huase << " ";
		cout << "|" << endl;
		for (int i = 0; i < 13; i++)
			cout << "|" << p[2].theCard[i].zhi << " " << p[2].theCard[i].zhi;
		cout << "|" << endl;
		cout << "+---+---+---+---+---+---+---+---+---+---+---+---+---+" << endl;

		cout << "West player:" << endl;
		cout << "+---+---+---+---+---+---+---+---+---+---+---+---+---+" << endl;
		for (int i = 0; i < 13; i++)
			cout << "|" << p[3].theCard[i].zhi << " " << p[3].theCard[i].zhi;
		cout << "|" << endl;
		for (int i = 0; i < 13; i++)
			cout << "| " << p[3].theCard[i].huase << " ";
		cout << "|" << endl;
		for (int i = 0; i < 13; i++)
			cout << "|" << p[3].theCard[i].zhi << " " << p[3].theCard[i].zhi;
		cout << "|" << endl;
		cout << "+---+---+---+---+---+---+---+---+---+---+---+---+---+" << endl;

		cout << "North player:" << endl;
		cout << "+---+---+---+---+---+---+---+---+---+---+---+---+---+" << endl;
		for (int i = 0; i < 13; i++)
			cout << "|" << p[0].theCard[i].zhi << " " << p[0].theCard[i].zhi;
		cout << "|" << endl;
		for (int i = 0; i < 13; i++)
			cout << "| " << p[0].theCard[i].huase << " ";
		cout << "|" << endl;
		for (int i = 0; i < 13; i++)
			cout << "|" << p[0].theCard[i].zhi << " " << p[0].theCard[i].zhi;
		cout << "|" << endl;
		cout << "+---+---+---+---+---+---+---+---+---+---+---+---+---+" << endl;

		cout << "East player:" << endl;
		cout << "+---+---+---+---+---+---+---+---+---+---+---+---+---+" << endl;
		for (int i = 0; i < 13; i++)
			cout << "|" << p[1].theCard[i].zhi << " " << p[1].theCard[i].zhi;
		cout << "|" << endl;
		for (int i = 0; i < 13; i++)
			cout << "| " << p[1].theCard[i].huase << " ";
		cout << "|" << endl;
		for (int i = 0; i < 13; i++)
			cout << "|" << p[1].theCard[i].zhi << " " << p[1].theCard[i].zhi;
		cout << "|" << endl;
		cout << "+---+---+---+---+---+---+---+---+---+---+---+---+---+" << endl;
		cout << endl;
	}
}

相关标签: 模拟题