开心的培训又开始了
今天是基础算法
所以我们来看一些比较奇怪的算法题
01
现在有一个n结点的树 并给你每一个节点的度数 你的目的是求出最长链的长度
01 我们可以利用贪心思想
以一种以1为单位的数插到主树干上 但是每插一次 长度就会发生一定的改变
02 无名算法
找出所有度数不是1的点 把这些点的个数 + 1 输出即可
03 需要注意 如果不满足树 的 定义需要输出-1 而满足树 的前提是 各节点的度数 和 = 2*(n-1)
02
已知某矩阵{a、b ,c ,d}的dec=a*d-b*c;
现在给你一个矩阵A 让你求出 dec=0的 矩阵 并使两个矩阵的差的最大值最小
01 赤裸裸的计算二分 没什么说的 直接二分答案求出的差最大值最小矩阵的元素的范围
02 求出范围之后 求交集即可
03 值得注意的是 在这里直接的计算实际上比人为的分类讨论更加简洁
04 我们也可以利用比例的性质 直接二分两个 比例之间的 关系值 k 这也是一种二分答案 但确实有一定的精度误差
03
求斐波那契数列的第n项%mod的值 其中n mod 为 输入值 mod 的范围为10的七次方+7 n<=10^18
01.并没有什么说的 这么大的数据 如此经典的的模型 不用Matrix 实在是太白瞎了
02.要注意数据范围 本题因为送分 每一个点都在long long 极限附近!!
03.重载运算符的面向对象的方法会更加简便
04.二进制的快速幂会使常数缩小为正常的2~3分之一 虽然这对于log 来说并没有什么用 但是要养成良好的习惯
代码实现 02的代码我正在改进 暂时没有
那我就发一下比较简单的01 和 03
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define MAXN 20
int a[MAXN+1];
int tmp;
int n;
int main()
{
freopen("tree.in", "r", stdin);
freopen("tree.out", "w", stdout);
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i];
if(sum!=2*(n-1))
{cout<<"-1"<<endl;return 0 ;}
for(int i=1;i<=n;i++)
if(a[i]==n-1)
{cout<<"2"<<endl;return 0;}
int sum=0;
for(int i=1;i<=n;i++)
sum+=a[i];
for(int i=1;i<=n;i++)
{
if(a[i]!=1)
tmp++;
}
tmp++;
cout<<tmp<<endl;
fclose(stdin);
fclose(stdout);
return 0;
}
03
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
long long mod;
struct Matrix
{
int n;
int m;
long long a[4][4];
Matrix () {}
Matrix (int x,int y)
{
n=x,m=y;
memset(a,0,sizeof(a));
}
};
Matrix operator*(Matrix a,Matrix b)
{
Matrix c(a.n,b.m);
for(int i=0;i<a.n;i++)
{
for(int j=0;j<b.m;j++)
{
for(int k=0;k<a.m;k++)
{
(c.a[i][j]+=a.a[i][k]*b.a[k][j]%mod)%=mod ;
}
}
}
return c;
}
Matrix pow(Matrix a,long long x)
{
Matrix res (a.n,a.m);
for(int i=0;i<a.n;i++)
res.a[i][i]=1;
for(; x; x>>=1 , a=a*a)
{
if(x&1)
{
res=res*a;
}
}
return res;
}
int main()
{
freopen("fibonacci.in", "r", stdin);
freopen("fibonacci.out", "w", stdout);
long long n;
cin>>n>>mod;
Matrix ans(2,2);
Matrix tmp(2,2);
ans.a[0][0]=ans.a[0][1]=1;
tmp.a[0][0]=tmp.a[0][1]=tmp.a[1][0]=1;
ans=ans*pow(tmp,n-1);
cout<<ans.a[0][0]<<endl;
fclose(stdin);
fclose(stdout);
return 0;
}
各位 明天见~!~~~