程序设计思维与实践 Week2 实验 A 化学

本文介绍了一种通过分析原子间的化学键和度数特征来识别和分类不同类型的烷烃基的算法。该算法首先记录每个原子的度数,然后根据特定的度数分布识别出五种常见的烷烃基类型,包括n-hexane、2-methylpentane、3-methylpentane、2,3-dimethylbutane和2,2-dimethylbutane。对于度数特征相同但结构不同的2-methylpentane和3-methylpentane,算法进一步检查原子的连接关系以进行区分。

题目来源:

Gym 270437A

题目描述:

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

 

假设如上图,这个烷烃基有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,2dimethylbutane中,有一个原子的度为4,而其他四种烷烃基则没有这个特点。所以思路就形成了,在输入时,利用数组记录每个原子的度。再通过烷烃基的度的特点来进行分类。但是,2-methylpentane和3-methylpentane中,原子的度的特点是一样的,此时则需要对这两种物质进行特判,即:在输入时记录原子的连接关系(类似于邻接矩阵),然后通过连接关系来区分这两种物质。

总结:

模拟题的算法难度并不大,但是侧重于对于逻辑的考察。做题时,要抓住题目的特点,注意观察。

AC代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int du[7],m[7][7],c[7];
string s[6];
int main()
{
	s[1]="n-hexane";
	s[2]="2-methylpentane";
	s[3]="3-methylpentane";
	s[4]="2,3-dimethylbutane";
	s[5]="2,2-dimethylbutane";
	int T,a,b;
	cin>>T;
	while(T--)
	{
		memset(c,0,sizeof(c));
		memset(du,0,sizeof(du));
		memset(m,0,sizeof(m));
		for(int i=1;i<=5;i++)
		{
			cin>>a>>b;
			du[a]++;du[b]++;
			m[a][b]++;
			m[b][a]++;
		}
		for(int i=1;i<=6;i++)
		{
			if(du[i]==1) c[1]++;
			if(du[i]==2) c[2]++;
			if(du[i]==3) c[3]++;
			if(du[i]==4) c[4]++;
		}
		if(c[4]==1)
		cout<<s[5]<<endl;
		else if(c[2]==4)
		cout<<s[1]<<endl;
		else if(c[3]==2)
		cout<<s[4]<<endl;
		else
		{
			int flag;
			for(int i=1;i<=6;i++)
			if(du[i]==3)
			{
				flag=i;
				break;
			}
			int sum=0;
			for(int i=1;i<=6;i++)
			if(m[flag][i])
			{
				if(du[i]==1)
				sum++;
			}
			if(sum==2)
			cout<<s[2]<<endl;
			else cout<<s[3]<<endl;
		}
	}
	return 0;
}

 

### 山东大学程序设计思维 Week5 旅途不止 相关内容 根据已知的信息,山东大学《程序设计思维实践》课程在第五周的内容涉及多个编程挑战问题,其中包括但不限于“巨石迷阵”、“有惊无险”、“天降甘霖”以及“终而复始”。这些题目通常围绕算法优化、数据结构应用等方面展开[^1]。 对于具体提到的“旅途不止”,虽然未直接提及该题目的详细描述,但从课程整体风格推测,“旅途不止”可能是一个综合性的动态规划或者区间查询类问题。这类问题往往需要处理大规模输入数据(如 \(n < 5 \times 10^5\)),并要求实现高效的解决方案以满足时间复杂度的要求。 以下是基于常见模式的一个假设性解答框架: #### 可能的解法思路 为了高效解决此类问题,可以采用如下方法: - **差分数组技术**:当涉及到频繁修改某个区间的值时,差分数组是一种非常有效的工具。通过维护一个辅助数组 `diff` 来记录原始数组的变化情况,在最后统一计算前缀和即可得到最终结果。 ```python def solve(n, s, queries): diff = [0] * (n + 2) # 初始化差分数组 for l, r in queries: diff[l] += 1 # 左端点加一 diff[r + 1] -= 1 # 右端点之后减去 result = [] current_sum = 0 # 当前累积和初始化为零 for i in range(1, n + 1): # 构造实际的结果序列 current_sum += diff[i] result.append(current_sum) return ''.join([str(x) for x in result]) ``` 上述代码片段展示了如何利用差分数组来快速更新大量连续区域内的数值变化,并能够在线性时间内完成整个过程[^2]。 #### 数据预处理的重要性 针对本题中的字符串操作部分,提前做好必要的转换工作同样至关重要。例如将字符映射成对应的整数形式以便后续更方便地执行逻辑判断等步骤。这种做法不仅简化了编码难度还提高了运行效率。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值