吉大培训 day 1 test

开心的培训又开始了
今天是基础算法
所以我们来看一些比较奇怪的算法题

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 
#include 
#include 
#include 
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"<return 0 ;}
    for(int i=1;i<=n;i++)
        if(a[i]==n-1)
            {cout<<"2"<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<return 0;
}

03

#include 
#include 
#include 
#include 
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;ifor(int j=0;jfor(int k=0;kreturn c;
}
Matrix pow(Matrix a,long long x)
{
    Matrix  res (a.n,a.m);
    for(int i=0;i1;
    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<0][0]<return 0;
}

各位 明天见~!~~~

你可能感兴趣的:(test,各种刷题)