蓝桥刷题--无尽的石头和DNA序列修正(c++)

无尽的石头

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

int main()
{
    int t ; cin >> t;
    while(t -- )
    {
        int n ; cin >> n; //目标石头编号
        int a = 1; 
        int id = 1;
        int c = 0;
        while(n != id) //可以相等执行,不能相等break 
        {
            int num = 0;
            while(a) //编号数的每个数相加 
            {
                num += a % 10;
                //cout << num << "\n";
                a /= 10;
                //cout << a << "\n";
            }
            a = id + num; //更新a和id 
            id += num;
            //cout << id << "\n";
            //cout << a << "\n";
            c += 1;//次数加一 
            //cout << c << "\n";
            if(id > n)break;
        }
          if(id <= n)cout << c << "\n";
          else cout << "-1" << "\n"; //无法到达输出-1 
    }
    return 0;
}

DNA序列修正

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

//目的:计算将字符串s1转换为字符串s2所需的最小操作次数,其中操作包括字符的替换和交换 

int find(string &s1,string &s2,int i,char a,char b) 
{
	//在字符串s1中从位置i开始查找字符a和字符b的位置,并返回第一个匹配的位置索引
	while (i < s1.size()) 
	{
        if (s2[i] == a && s1[i] == b) return i;
        i++;
    }
    //如果没有找到匹配的位置,则返回-1
    return -1;
}
int main() 
{
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    int n,cnt = 0; cin >> n;
    string s1,s2; cin >> s1 >> s2;
    //定义了一个名为mp的映射(map),用于存储字符之间的对应关系
    map<char,char>mp = {{'A','T'},{'C','G'},{'T','A'},{'G','C'}};
    //使用循环遍历字符串s1中的每个字符,并将其替换为对应的字符
    for (int i = 0; i < n; i++) s1[i] = mp[s1[i]];
    for (int i = 0; i < n; i++) 
	{
        if (s1[i] != s2[i]) 
		{
			//如果两个字符串在相同位置上的字符不相等,则调用find函数查找在s1中与s2[i]相等且与s1[i]不相等的字符的位置
            int x = find(s1,s2,i,s1[i],s2[i]);
            //如果找到了匹配的位置,则交换s2[i]和s2[x]的值
            if (x != -1) swap(s2[i],s2[x]);
            //否则,将s2[i]的值设置为s1[i]的值
            else s2[i] = s1[i];
            //每次进行这样的操作时,计数器cnt加1
            cnt++; 
        }
    }
    cout << cnt << '\n';
   

  • 5
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值