温馨提示:本系列文章非所有题都对对b组适用,b组的小伙伴请挑题看!
目录
第一题
题目链接
题目解析
代码原理
对于零基础小白而言,平方和立方都不是难事,用个pow()函数就可以解决,实在不会还有i * i * i这种方式解决。这里对零基础小白而言博主盲猜应该是如何判断,其实很简单,我们可以将平方和立方后得到结果转为字符串,然后将两个字符串拼接在一起,最后去判断长度即可,但是也会有小伙伴问那重复了怎么办,很简单使用set容器即可,这里建议新加入的小白可以先去看一下下面这篇文章
文章链接
代码编写
#include<iostream>
#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
bool check(string ret)
{
set<char> d;
for(int i = 0; i < ret.size(); i++)
{
d.insert(ret[i]);
}
return ret.size() == 10 && d.size() == 10;
}
int main()
{
ll n = 100000;
string s1, s2;
for(ll i = 1; i < n; i++)
{
ll tmp = i * i;
s1 = to_string(tmp);
tmp = i * i * i;
s2 = to_string(tmp);
string ret = s1 + s2;
if(check(ret))
{
cout << i;
break;
}
}
return 0;
}
本题总结
第二题
题目链接
题目解析
代码原理
代码编写
#include<iostream>
#include<bits/stdc++.h>
using namespace std;
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int n = 0;
cin >> n;
int ret = n;
while(n >= 3)
{
int new_bottles = n / 3;
ret += new_bottles;
n = n % 3 + new_bottles;
}
cout << ret;
return 0;
}
本题总结
本题其实没有什么可以总结的,但是在做题上还是有东西可以总结的,有的小伙伴可能读完题目就发呆了,不知道干什么,那么今天博主带大家解决一下这类问题。
1.在读题的时候,我们可以记录一下一些有用的信息
2.需要画图的时候,就一定要画图,不要凭借脑子在那里空想
3.根据自己的图解,进行编写代码
4.如果出现报错,那么先去看一下报错信息(这里可能就需要一点英语词汇量了,这个自行解决),如果是timeout之类的词说明超时了,那么你就需要重新去检查代码,看看哪里死循环了,当然不是所有的超时都是死循环,有的是超过了题目所规定的时长,那么这个就是时间复杂度上的问题了,那么又会有小伙伴问了,那我看代码,具体该怎么看呢?我们把自己当成计算机,一步一步地去执行每一行代码即可。
第三题
题目链接
题目解析
代码原理
代码编写
略
本题总结
略
第四题
题目链接
题目解析
代码原理
如何找规律?
观察数字之间的关系,是不是求和、指数,以及两者之间的差值是否存在什么关系
代码编写
#include<iostream>
#include<bits/stdc++.h>
using namespace std;
int main()
{
int sum = 1, i = 1, j = 2;
for(int t = 2; t <= 100; t++)
{
sum += i + j;
i += j; //更新i
j++;//更新j
}
cout << sum << endl;
return 0;
}
本题总结
略
第五题
题目链接
题目解析
代码原理
代码编写
略
第六题
题目链接
题目解析
代码原理
全排列 + 判断
代码编写
代码一
#include<iostream>
#include<bits/stdc++.h>
using namespace std;
int a[] = {1,2,3,4,5,6,7,8,9,10,11,12,13};
int ans;
bool judge()
{
if(a[0] + a[1] == a[2] && a[3] - a[4] == a[5] && a[6] * a[7] == a[8] && a[9] % a[10] == 0 && a[9] / a[10] == a[11])
return true;
return false;
}
int main()
{
do{
if(judge())
ans++;
}while(next_permutation(a, a + 13));
cout << ans;
return 0;
}
代码二
#include<iostream>
#include<bits/stdc++.h>
using namespace std;
int a[] = {1,2,3,4,5,6,7,8,9,10,11,12,13};
int ans;
bool judge()
{
if(a[0] + a[1] == a[2] && a[3] - a[4] == a[5] && a[6] * a[7] == a[8] && a[9] % a[10] == 0 && a[9] / a[10] == a[11])
return true;
return false;
}
void f(int n)
{
int tmp = 0;
if(n == 13)
{
if(judge())
ans++;
}
for(int i = n; i < 13; i++)
{
{tmp = a[i]; a[i] = a[n]; a[n] = tmp;}//回溯
f(n + 1);//递归
{tmp = a[i]; a[i] = a[n]; a[n] = tmp;}//回溯
}
}
int main()
{
f(0);
cout << ans;
return 0;
}
//以上两段代码仅适合用于填空题(会超时)
代码优化
#include<iostream>
#include<bits/stdc++.h>
using namespace std;
int a[] = {1,2,3,4,5,6,7,8,9,10,11,12,13};
int ans;
bool judge()
{
if(a[0] + a[1] == a[2] && a[3] - a[4] == a[5] && a[6] * a[7] == a[8] && a[9] % a[10] == 0 && a[9] / a[10] == a[11])
return true;
return false;
}
void f(int n)
{
int tmp = 0;
if(n == 13)
{
if(judge())
ans++;
}
for(int i = n; i < 13; i++)
{
//全排列
{tmp = a[i]; a[i] = a[n]; a[n] = tmp;}//回溯
if((n == 2 && a[0] + a[1] != a[2]) || (n == 5 && a[3] - a[4] != a[5]))
{
{tmp = a[i]; a[i] = a[n]; a[n] = tmp;}//回溯
continue;
}
f(n + 1);//递归
{tmp = a[i]; a[i] = a[n]; a[n] = tmp;}//回溯
}
}
int main()
{
f(0);
cout << ans;
return 0;
}
本题总结
1.题目特征的总结
1.元素集合明确
2.不同排列顺序会产生不同结果,且都需要考虑
2.函数总结
next_permutation(起始位置,终点位置)、
作用:全排列
3.全排列模板总结
for(int i = 形参; i < 最大值【这里的最大值看题意】; i++)
{
{交换}
函数名(形参 + 1);//递归
{交换}//回溯
}
第七题
题目链接
题目解析
代码原理
特征识别: 1.元素唯一性2.顺序相关性
依据:
方法:全排列
代码编写
代码一
#include<iostream>
#include<bits/stdc++.h>
using namespace std;
int a[] = {1,2,3,4,5,6,7,8,9};
int ans;
bool judge()
{
int x = a[3] * 100 + a[4] * 10 + a[5];
int y = a[6] * 100 + a[7] * 10 + a[8];
if((a[2] * x + a[1] * y) % (a[2] * y) == 0&& a[0] + (a[2] * x + a[1] * y) / (a[2] * y) == 10)
return true;
return false;
}
int main()
{
do
{
if(judge())
ans++;
}while(next_permutation(a, a + 9));
cout << ans;
return 0;
}
代码二
#include<iostream>
#include<bits/stdc++.h>
using namespace std;
int a[] = {1,2,3,4,5,6,7,8,9};
int ans;
bool judge()
{
int x = a[3] * 100 + a[4] * 10 + a[5];
int y = a[6] * 100 + a[7] * 10 + a[8];
if((a[2] * x + a[1] * y) % (a[2] * y) == 0&& a[0] + (a[2] * x + a[1] * y) / (a[2] * y) == 10)
return true;
return false;
}
void f(int n)
{
if(n == 9)
{
if(judge())
ans++;
}
for(int i = n; i < 9; i++)
{
{int tmp = a[i]; a[i] = a[n]; a[n] = tmp;}
f(n + 1);
{int tmp = a[i]; a[i] = a[n]; a[n] = tmp;}
}
}
int main()
{
f(0);
cout << ans;
return 0;
}
本题总结
同第六题
本篇文章的内容就先到这里,我们下篇文章再见。