此处使用的Floyd算法,此代码在运行时需要等待一两分钟才出结果,因为这道题在比赛中是填空题,所以我觉得这种方法即使运行时间稍微有点长,但是从写代码到得出结果的总时间还是相对较短,适合比赛时间紧急得出结果的情况
#include<iostream>
#include<cmath>
using namespace std;
const int N=2030;
const int inf=1e9+7;
int g[N][N];
//求a和b的最大公约数
int gcd(int a,int b)
{
return b==0 ? a : gcd(b,a%b);
}
int main()
{
for(int i=1;i<=2021;i++)
{
for(int j=1;j<=2021;j++)
{
g[i][j]=inf;
}
}
for(int i=1;i<=2021;i++)
{
for(int j=1;j<=2021;j++)
{
if(abs(i-j)<=21)
{
// i*j/gcd(i,j)=i和j的最小公倍数
g[i][j]=i*j/gcd(i,j);
}
}
}
//此处使用的是Floyd算法
//这里运行时间过长,但不是出错,稍微等待一两分种即可出结果
//因为这道题是填空题,所以即使这种算法运行时间稍微有点长,但是简单好用出结果
for(int k=1;k<=2021;k++)
{
for(int i=1;i<=2021;i++)
{
for(int j=1;j<=2021;j++)
{
g[i][j]=min(g[i][j],g[i][k]+g[k][j]);
}
}
}
cout<<g[1][2021]<<endl;
return 0;
}