您的位置:首页 > 其它

吉大培训 day 1 test

2016-01-16 21:52 323 查看
开心的培训又开始了

今天是基础算法

所以我们来看一些比较奇怪的算法题

01

现在有一个n结点的树 并给你每一个节点的度数 你的目的是求出最长链的长度

[code]01 我们可以利用贪心思想
    以一种以1为单位的数插到主树干上 但是每插一次 长度就会发生一定的改变
02 无名算法  
    找出所有度数不是1的点  把这些点的个数 + 1 输出即可
03 需要注意   如果不满足树 的 定义需要输出-1 而满足树 的前提是 各节点的度数 和 = 2*(n-1)


02

已知某矩阵{a、b ,c ,d}的dec=a*d-b*c;

现在给你一个矩阵A 让你求出 dec=0的 矩阵 并使两个矩阵的差的最大值最小

[code]01 赤裸裸的计算二分   没什么说的  直接二分答案求出的差最大值最小矩阵的元素的范围
02 求出范围之后  求交集即可
03 值得注意的是  在这里直接的计算实际上比人为的分类讨论更加简洁
04 我们也可以利用比例的性质 直接二分两个 比例之间的 关系值 k  这也是一种二分答案 但确实有一定的精度误差


03

求斐波那契数列的第n项%mod的值 其中n mod 为 输入值 mod 的范围为10的七次方+7 n<=10^18

[code]01.并没有什么说的  这么大的数据  如此经典的的模型  不用Matrix 实在是太白瞎了
02.要注意数据范围  本题因为送分  每一个点都在long long 极限附近!!
03.重载运算符的面向对象的方法会更加简便
04.二进制的快速幂会使常数缩小为正常的2~3分之一  虽然这对于log 来说并没有什么用 但是要养成良好的习惯


代码实现 02的代码我正在改进 暂时没有

那我就发一下比较简单的01 和 03

[code]#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

[code]#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;
}


各位 明天见~!~~~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: