无尽的石头
#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';