[iHooya]1月16日寒假班作业解析

加密的病历单
小英是药学专业大三的学生,暑假期间获得了去医院药房实习的机会。在药房实习期间,小英扎实的专业基础获得了医生的一致好评,得知小英在计算概论中取得过好成绩后,主任又额外交给她一项任务,解密抗战时期被加密过的一些伤员的名单。
经过研究,小英发现了如下加密规律(括号中是一个“原文 -> 密文”的例子)

  1. 原文中所有的字符都在字母表中被循环左移了三个位置(dec -> abz)
  2. 逆序存储(abcd -> dcba )
  3. 大小写反转(abXY -> ABxy)

输入:一个加密的字符串。(长度小于50且只包含大小写字母)
输出:输出解密后的字符串。

样例输入GSOOWFASOq
样例输出Trvdizrrvj
在这里插入图片描述

#include <bits/stdc++.h>
using namespace std;

int main()
{
	string s;
	cin >> s;
	for (int a = 0; a < s.length(); a++)
	{
		if (s[a] >= 'a' && s[a] <= 'z') //小写变大写
			s[a] = s[a] - 32;
		else if (s[a] >= 'A' && s[a] <= 'Z')
			s[a] = s[a] + 32;
	}
	reverse(s.begin(), s.end()); //逆序存放
	for (int a = 0; a < s.length(); a++)
	{
		if (s[a] >= 'a' && s[a] <= 'w' || s[a] >= 'A' && s[a] <= 'Z')//向后移动3个位置ASCII码+3
			s[a] = s[a] + 3;
		else if (s[a] >= 'x' && s[a] <= 'z' || s[a] >= 'X' && s[a] <= 'Z')//超出字典序了,重新从a或A开始
			s[a] = s[a] - 23;
	}
	cout << s;

	return 0;
}

基因相关性
为了获知基因序列在功能和结构上的相似性,经常需要将几条不同序列的DNA进行比对,以判断该比对的DNA是否具有相关性。
现比对两条长度相同的DNA序列。首先定义两条DNA序列相同位置的碱基为一个碱基对,如果一个碱基对中的两个碱基相同的话,则称为相同碱基对。接着计算相同碱基对占总碱基对数量的比例,如果该比例大于等于给定阈值时则判定该两条DNA序列是相关的,否则不相关。

输入
有三行,第一行是用来判定出两条DNA序列是否相关的阈值,随后2行是两条DNA序列(长度不大于500)。

输出
若两条DNA序列相关,则输出“yes”,否则输出“no”。

样例输入
0.85
ATCGCCGTAAGTAACGGTTTTAAATAGGCC
ATCGCCGGAAGTAACGGTCTTAAATAGGCC

样例输出
yes

#include<bits/stdc++.h>
using namespace std;
//相同就计数,计算计算相同碱基对占总碱基对数量的比例
int main()
{
	double max=0.0;
	cin>>max;
	string s1,s2;
	cin>>s1>>s2;
	int count=0;
	for(int a=0;a<s1.length();a++)
	{
		if(s1[a]==s2[a])
			count++;
	}	
	if(1.0*count/s1.length()>=max)	
		cout<<"yes";
	else
		cout<<"no";
	return 0;
}

配对碱基链
脱氧核糖核酸(DNA)由两条互补的碱基链以双螺旋的方式结合而成。而构成DNA的碱基共有4种,分别为腺瞟呤(A)、鸟嘌呤(G)、胸腺嘧啶(T)和胞嘧啶(C)。我们知道,在两条互补碱基链的对应位置上,腺瞟呤总是和胸腺嘧啶配对,鸟嘌呤总是和胞嘧啶配对。你的任务就是根据一条单链上的碱基序列,给出对应的互补链上的碱基序列。

输入
一个字符串,表示一条碱基链。这个字符串只含有大写字母A、T、G、C,分别表示腺瞟呤、胸腺嘧啶、鸟嘌呤和胞嘧啶。字符串长度不超过255。

输出
一个只含有大写字母A、T、G、C的字符串,为与输入的碱基链互补的碱基链。

样例输入
ATATGGATGGTGTTTGGCTCTG

样例输出
TATACCTACCACAAACCGAGAC

#include<bits/stdc++.h>
using namespace std;
int main()
{
	string s1,s2;
	cin>>s1;
	s2=s1;
	for(int a=0;a<s1.length();a++)
		if(s1[a]=='A')
			s2[a]='T';
		else if(s1[a]=='T')
			s2[a]='A';
		else if(s1[a]=='G')
			s2[a]='C';
		else if(s1[a]=='C')
			s2[a]='G';
	cout<<s2;
		return 0;
}

利用指针交换两个变量的数据

#include <bits/stdc++.h>
using namespace std;

int main()
{
	int a, b, c;
	cin >> a >> b;
	int *p1 = &a, *p2 = &b;
	c = *p1;
	*p1 = *p2;
	*p2 = c;
	cout << a << " " << b;

	return 0;
}

最长公共子序列
给定两个长度分别为N和M的字符串A和B,求既是A的子序列又是B的子序列的字符串长度最长是多少。

输入格式

第一行包含两个整数N和M。

第二行包含一个长度为N的字符串,表示字符串A。

第三行包含一个长度为M的字符串,表示字符串B。

字符串均由小写字母构成。

输出格式

输出一个整数,表示最大长度。

数据范围

1≤N,M≤1000

输入样例:

4 5
acbd
abedc
输出样例:

3
在这里插入图片描述

#include <bits/stdc++.h>
using namespace std;

int n, m;
char arr1[1010], arr2[1010];
int dp[1010][1010];

int main()
{
	cin >> n >> m;
	cin >> arr1 + 1 >> arr2 + 1;
	for (int a = 1; a <= n; a++)
	{
		for (int b = 1; b <= m; b++)
		{
			dp[a][b] = max(dp[a - 1][b], dp[a][b - 1]);
			if (arr1[a] == arr2[b])
				dp[a][b] = max(dp[a][b], dp[a - 1][b - 1] + 1);
			//	cout << a << b << dp[a][b] << endl;
		}
//		cout << endl;
	}
	cout << dp[n][m] << endl;
	return 0;
}
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值