笔试练习day8
目录
- HJ108 求最小公倍数
- 题目解析
- 代码
- 数组中的最长连续子序列
- 题目解析
- 代码
- 字母收集
- 题目解析
- 代码
感谢各位大佬对我的支持,如果我的文章对你有用,欢迎点击以下链接
🐒🐒🐒 个人主页
🥸🥸🥸 C语言
🐿️🐿️🐿️ C语言例题
🐣🐣🐣 python
🐓🐓🐓 数据结构C语言
🐔🐔🐔 C++
🐿️🐿️🐿️ 文章链接目录
🏀🏀🏀 笔试练习题
HJ108 求最小公倍数
链接
题目解析
这道题是求最大公约数,最大公约数表示位lcm(a,b)
我们都知道最大公约数lcm(a,b)有这么一个等式
lcm(a,b)=ab/gcb(a,b)(最大公约数)
比如a=4 b=8那么计算就为ab/(4)=8
这道题有两种思路
一种是试除法,就是a和b从大到小一个一个的除,或者就是a和b在2到9这个范围内一直除,直到除完为止
另一种就是辗转相除法
在这道题中最大公约数是这样表示的gcb(a,b)=gcb(b,a%b)
也就是说a和b的最大公约数等于b和a%b的最大公约数
现在我们将gcb(b,a%b)中的第一个数重新命名位c,a%b出现命名为d
那么就是变成了gcb(c,d)
然后我们以同样的方法
gcb(c,d)=gcb(d,c%d)…
这种就转换成了递归的方式求解
代码
#include <iostream>
using namespace std;
int gcb(int a,int b)
{
if(b==0)
return a;
return gcb(b,a%b);
}
int main() {
int a=0,b=0;
cin>>a>>b;
cout<<(a*b/gcb(a,b))<<endl;
return 0;
}
数组中的最长连续子序列
链接
题目解析
这道题题目有点难理解
就以题目的例子为例
[100,4,200,1,3,2] 我们可以抽出1 2 3 4组成一个连续序列
因为题目要求的只是值连续,位置不用管,即使4在1 3 2的前面也没问题
我的想法就是遍历一遍数组,我们取名为arr1,然后用一个数组arr2,用arr2的下标表示arr1数组里面元素的值,最后只需要遍历一遍arr2就可以了
另一种思路就是先排完序,然后用双指针的方法重新遍历一遍arr1
比如
当j-i的值为1的时候,i和j就往后走
当j-i=0时就直接跳过
就这样一直遍历,最后输出长度
代码
class Solution {
public:
int MLS(vector<int>& arr) {
sort(arr.begin(),arr.end());
int n=arr.size(),ret=0;
for(int i=0;i<n;)
{
int j=i+1,count=1;
while(j<n)
{
if(arr[j]-arr[j-1]==1)
{
count++;
j++;
}
else if(arr[j]-arr[j-1]==0)
{
j++;
}
else
break;
}
ret=max(ret,count);
i=j;
}
return ret;
}
};
for循环中 for(int i=0;i<n;) 没有i++是因为后面 i=j会将i的值进行变化,如果有i++的话那么i的位置会发生变化
字母收集
链接
题目解析
这道题是用动态规划去做
从题目可以得到小红只能往下和右这两个方向走,直到走到f
具体做法就是先用状态表示
当小红到达( i , j )这个位置时的最大得分是多少,我们以dp[ i ][ j ]表示
然后构造状态转移方程
小红到达这个位置的两种情况
我们假设(i,j)这个位置的分数为1
那么dp[ i ][ j ]=max( dp[i-1] [ j ] + 1,dp[ i ] [j-1] + 1)
然后我们还需要考虑初始化问题,这里有两种方式,第一种就是直接得到dp[ 1 ] [ 1 ]的值,另一种就是多加一行一列,然后让这些多加的初始值设为0,这样dp[0][0]就为0了
代码
#include <iostream>
using namespace std;
const int N=510;
char g[N][N];
int dp[N][N];
int m,n;
int main() {
cin>>m>>n;
for(int i=1;i<=m;i++)
{
for(int j=1;j<=n;j++)
{
cin>>g[i][j];
int t=0;
if(g[i][j]=='l') t=4;
else if(g[i][j]=='o') t=3;
else if(g[i][j]=='v') t=2;
else if(g[i][j]=='e') t=1;
else t=0;
dp[i][j]=max(dp[i-1][j],dp[i][j-1])+t;
}
}
cout<<dp[m][n]<<endl;
return 0;
}