牛客网做题链接:求最小公倍数_牛客题霸_牛客网 (nowcoder.com)
要找到两个正整数A和B的最小公倍数,我们可以采用一个公式,即两数之积除以它们的最大公约数。为了求得这个最大公约数,有多种方法可供选择,其中最为人所熟知的是穷举法和辗转相除法。在这里,我们主要关注并应用这两种方法:穷举法和辗转相除法,来求解A和B的最大公约数,进而求得它们的最小公倍数。
#include <iostream>
using namespace std;
int main()
{
int a, b;
cin >> a >> b;
int min = a>b ? a : b;
int ret = 0;
for(int i = 1;i <= min;i++)
{
if(a%i == 0 && b%i == 0)
ret = i;
}
cout << a*b/ret << endl;
return 0;
}
辗转相除法就是用a对b求余,若余数为0,则除数b为最大公约数。若余数不为0,将此余数r作为新的除数,b作为新的被除数,重新求余,直到余数为0为止。此时的最大公约数为除数
#include <iostream>
using namespace std;
int gcd(int a,int b)
{
if(b == 0)
return a;
return gcd(b,a%b);
}
int main() {
int a, b;
cin >> a >> b;
cout << a*b/gcd(a,b) << endl;
return 0;
}
跟字符串中找出连续最长的数字串思路类似的计数。因为是无序数组所以先采用sort数组的排序,然后利用变量count记录更新长度,利用len保留最大长度并最后返回,然后遍历数组,当相邻的元素是连续的就更新count长度,如果相邻的数值相同则越过继续判断下一位元素即可,最后遍历结束返回最大值len,其中涉及一些细节处理。
class Solution {
public:
int MLS(vector<int>& arr)
{
sort(arr.begin(),arr.end());
int len = arr.size();
int j = 0;
int countlen = 1;
int maxcount = 0;
for(int i = 0;i < len; i+=countlen)
{
j = i + 1;
countlen = 1;
while(j < len)
{
if(arr[j] - arr[j-1] == 1)
{
countlen++;
j++;
}
else if(arr[j] - arr[j-1] == 0)
{
j++;
}
else
{
break;
}
}
maxcount = max(maxcount , countlen);
}
return maxcount;
}
};
牛客网做题链接:字母收集_牛客题霸_牛客网 (nowcoder.com)
经典的二维动态规划问题,由题目规则很容易想到: dp[i][j]表示:到第i行j列的最大分数和; 那么推导状态转移方程就是:dp[i][j] = 由左边dp[i][j-1]或上方dp[i-1][j],再加上其分数得到; 即: dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]) + score
#include <iostream>
using namespace std;
const int N = 501;
char ch[N][N];
int dp[N][N];
int main() {
int n,m;
cin >> n >> m;
for(int i = 1;i <= n;i++)
{
for(int j = 1;j <= m;j++)
{
cin >> ch[i][j];
}
}
int score = 0;
for(int i = 1;i <= n;i++)
{
for(int j = 1;j <= m;j++)
{
if(ch[i][j] == 'l')
score = 4;
else if(ch[i][j] == 'o')
score = 3;
else if(ch[i][j] == 'v')
score = 2;
else if(ch[i][j] == 'e')
score = 1;
else
score = 0;
dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]) + score;
}
}
cout << dp[n][m] << endl;
return 0;
}
学习编程就得循环渐进,扎实基础,勿在浮沙筑高台