5 条题解
-
7
我们可以编写一个函数,将一个字符串内的每个字符变成数字存储到数组里(注意数组要开到2000以上)然后循环将数组每两个数字相加之后求余10,得到的结果再相加求余10,最终会剩一个数字,返回该数字即可。
然后在主函数中我们将两个字符串变量a和b相加(也就是连接字符串ab)放入函数,再将b和a相加放入函数,将得到的两个返回值比较即可。
我的代码没有用字符串连接,比较麻烦,可以看一下千夜老师的另外一篇题解。
int bj(string x,string y) { memset(t,0,sizeof(t)); int l1 = x.length(); int l2 = y.length(); int l = l1+l2; for(int i=0;i<l1;i++) { t[i] = x[i]-'a'; } for(int i=0;i<l2;i++) { t[i+l1] = y[i]-'a'; } while(l-->0) { for(int i=0;i<l;i++) { t[i] = (t[i]+t[i+1])%10; } } return t[0]; } int main() { cin >> a >> b; cout << max(bj(a,b),bj(b,a)); return 0; }
-
3
#include <bits/stdc++.h> using namespace std; string a,b; int t[2005]; int mo(string x,string y){ memset(t,0,sizeof(t));//初始化 int x1=x.length();//x的长度 int y1=y.length();//y的长度 int ans=x1+y1;//总长度 for (int i=0;i<x1;i++){ t[i]=x[i]-'a'; } for (int i=0;i<y1;i++){ t[i+x1]=y[i]-'a';//转换成数字 }//也可以字符串拼接再转换 while((ans--)>0){//由于输出的是一个数,所以是>0 for (int i=0;i<ans;i++){ t[i]=(t[i]+t[i+1])%10; } } return t[0]; } int main(){ cin>>a>>b; cout<<max(mo(a,b),mo(b,a));//两种情况 return 0; }
-
3
本代码时间复杂度为O(n^2)
本题的求法有点类似杨辉三角
题目中给到的数据是1≤名字长度≤1000,很多人会把数组开到1000*1000,但是要注意有两个名字,所以至少要开到2000*2000(我第一次就是开到了1000*1000QwQ)string a, b; short ans1[2000][2000], ans2[2000][2000], lenA, lenB, len;
ans1与ans2分别记录两个不同的名字排列所形成的三角形,lenA记录字符串a的长度,lenB同理,len为两个字符串相加的总长度。
int main(){ ios::sync_with_stdio(false); // O2优化 输入输出加速 cin.tie(0); cout.tie(0); cin >> a; lenA = a.length(); // 用变量保存字符串长度(.length()的时间复杂度好像是O(n)来着) cin >> b; lenB = b.length(); len = lenA + lenB; for (short i = 0; i < lenA; i++) { ans1[0][i] = short(a[i] - 'a'); // 打表【ans1】第一行前半部分 } for (short i = 0; i < lenB; i++) { ans2[0][i] = short(b[i] - 'a'); // 打表【ans2】第一行前半部分 } for (short i = 0; i < lenB; i++) { ans1[0][i + lenA] = short(b[i] - 'a'); // 打表【ans1】第一行后半部分 } // 这里的for必须写成这种逻辑,不然大概率会出现字符串越界,程序崩溃! for (short i = 0; i < lenA; i++) { ans2[0][i + lenB] = short(a[i] - 'a'); // 打表【ans2】第一行后半部分 } // 这里的for必须写成这种逻辑,不然大概率会出现字符串越界,程序崩溃! for (short i = 1; i < len; i++) { // 从第二行开始 for (short j = 0; j < len - i; j++) { // 从第一列开始 ans1[i][j] = (ans1[i - 1][j] + ans1[i - 1][j + 1]) % 10; // 依次计算 ans2[i][j] = (ans2[i - 1][j] + ans2[i - 1][j + 1]) % 10; // 依次计算 } } cout << max(ans1[len - 1][0], ans2[len - 1][0]) << "\n"; // 输出结果 /* * 下面这个被注释掉的代码为调试时的打表,检查输入数据和计算是否有 * bug用的,感兴趣的同学可以自行取消注释看看打表是什么样子的,递 * 交的时候记得重新注释掉或者删掉哦。 */ /* for (short i = 0; i < len; i++) { for (short j = 0; j < len - i; j++) { cout << ans1[i][j] << " "; } cout << "\n"; } */ return 0; }
-
0
总体不太难(像我这种菜鸡都能做出来)😄
string a, b; char x[2000]; int c[2000]; int find (string a, string b) { int aa = a.length(); int bb = b.length(); int cc = aa + bb; for (int i = 0; i < aa; i++) { x[i] = a[i]; } for (int i = aa; i < cc; i++) { x[i] = b[i - aa]; } for (int i = 0; i < cc; i++) { c[i] = x[i] - 'a'; } for (int i = cc; i > 0; i--) { for (int j = 0; j < i - 1; j++) { c[j] = (c[j] + c[j + 1]) % 10; } } return c[0]; } int main() { cin >> a >> b; cout << max(find(a, b), find(b, a)); return 0; }
-
-9
写题解请注意 鼓励大家写题解,但注意题解格式。
题解一定要有思路解析或代码注释,能否让别人理解你的思路
也是你的能力的检验,不要只放无意义的代码给大家复制,那就失去了做题的初心。
给代码两端加上这个会舒服一些
```cpp
你的代码
```
</span>
这个点在键盘的左上角tab上面那个键,注意切换输入法
#include<iostream> using namespace std; int main() { int n; cin>>n;//这是一个注释 return 0; }
请注意严禁抄袭题解,写题解不要只放代码,需加上你的思路或代码注释。
抄袭题解一经发现直接取消成绩。
题解被删除的可能
- 代码不符合格式规范
- 没有思路讲解或者没有注释,
- 无意义的题解
大家携手共同维护一个良好的编程环境,如果一经发现,多次作乱。可能会被管理员拉黑,请注意,一旦拉黑即失去登陆资格。
- 1
信息
- ID
- 1197
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 5
- 标签
- 递交数
- 672
- 已通过
- 234
- 上传者