• 湖南大学第十四届ACM程序设计新生杯(重现赛)


    RANK  0 题数 0

    期末复习没有参加,补几道喜欢的题。

    A: AFei Loves Magic  签到

    思路 :不需考虑 碰撞 直接计算最终状态即可。

    #include<bits/stdc++.h>
    using namespace std;
    #define maxn 12345
    int ans,n,l,t,x,d;
    int main()
    {
        scanf("%d%d%d",&n,&l,&t);
        for(int i=1;i<=n;i++)
        {
            scanf("%d%d",&x,&d);
            if(d==1)
                if(x+t<l)ans++;
            if(d==2)
                if(x-t>0)ans++;
        }
        printf("%d
    ",ans+1);
        return 0;
    }  

    D: Dandan's lunch

    叉积计算 三角形面积,没有给定点的顺序需要取绝对值。

    #include<bits/stdc++.h>
    using namespace std;
    #define ll long long
    #define maxn 123456
    struct node
    {
        ll x[5],y[5],sum;
        bool operator<(const node &b)const
        {
            return sum>b.sum;
        }
    } a[maxn];
    void cal(int id)
    {
        ll s1=0,s2=0;
        for(int i=1; i<=3; i++)
        {
            s1+=a[id].x[i]*a[id].y[i+1];
            s2+=a[id].x[i+1]*a[id].y[i];
        }
        a[id].sum=fabs(s1-s2);
    }
    ll n,rk,cp,one;
    int main()
    {
        rk=0;
        scanf("%lld",&n);
        for(int i=0; i<n; i++)
        {
            scanf("%lld",&cp);
            if(i==0)one=cp;
            else
            {
                if(cp>one)rk++;
            }
            for(int j=1; j<=3; j++)
                scanf("%lld%lld",&a[i].x[j],&a[i].y[j]);
            a[i].x[4]=a[i].x[1];
            a[i].y[4]=a[i].y[1];
            cal(i);
        }
        sort(a,a+n);
        printf("%lld
    ",a[rk].sum);
        return 0;
    }
    

     F:Find the AFei Numbers

    裸数位DP根据自己喜欢的方式定合理dp状态。

    #include<bits/stdc++.h>
    using namespace std;
    #define ll long long
    #define maxn 1324
    ll t,n,dp[23][2][2][2];
    int num[25],id;
    ll dfs(int cnt,bool is520,bool is52,bool is5,bool limit)
    {
        if(cnt==0)return is520?1:0;
        if(!limit&&dp[cnt][is520][is52][is5]!=-1)
            return dp[cnt][is520][is52][is5];
        ll sum=0,up=(limit?num[cnt]:9);
        for(int i=0; i<=up; i++)
        {
            if(is520)
                sum+=dfs(cnt-1,1,0,0,(limit&&i==up));
            else if(is52&&i==0)
                sum+=dfs(cnt-1,1,0,0,(limit&&i==up));
            else if(is5&&i==2)
                sum+=dfs(cnt-1,0,1,0,(limit&&i==up));
            else if(i==5)
                sum+=dfs(cnt-1,0,0,1,(limit&&i==up));
            else
                sum+=dfs(cnt-1,0,0,0,(limit&&i==up));
        }
        if(!limit)dp[cnt][is520][is52][is5]=sum;
        return sum;
    }
    ll solve()
    {
        id=0;
        while(n)
        {
            num[++id]=n%10;
            n/=10;
        }
        return dfs(id,0,0,0,1);
    }
    int main()
    {
        scanf("%lld",&t);
        while(t--)
        {
            memset(dp,-1,sizeof(dp));
            scanf("%lld",&n);
            printf("%lld
    ",solve());
        }
        return 0;
    }
    

     L:The Digits String

    思路 :dp[ n ] [ 4 ]  代表长度为 n时 取余4为0 的方案数 ,取余4为1的方案数 ,取余4为2的方案数 ,取余4为3的方案数。 

    根据每次数字增加一个长度 的种类 只有 10种  0  -  9 很容易写出递推方程 ,由于 n较大 ,矩阵快速幂加速即可。

    #include<bits/stdc++.h>
    using namespace std;
    #define maxn 123456
    #define ll long long
    #define mod 2019
    struct node
    {
        ll a[10][10];
        void up1()
        {
            for(int i=0; i<5; i++)
                for(int j=0; j<=5; j++)
                    if(i==j)a[i][j]=1;
                    else a[i][j]=0;
        }
        void up2()
        {
            for(int i=0; i<5; i++)
                for(int j=0; j<=5; j++)
                    a[i][j]=0;
        }
    } mat,one,mtt;
    ll n,ans;
    node p(node xx,node yy)
    {
        node cc;
        cc.up2();
        for(int k=1; k<=4; k++)
            for(int i=1; i<=4; i++)
                for(int j=1; j<=4; j++)
                    cc.a[i][j]=(cc.a[i][j]+(xx.a[i][k]*yy.a[k][j])%mod)%mod;
        return cc;
    }
    node qpow(ll b)
    {
        node ret;
        ret.up1();
        while(b)
        {
            if(b%2)
                ret=p(ret,mat);
            mat=p(mat,mat);
            b/=2;
        }
        return ret;
    }
    int main()
    {
        one.a[1][1]=3,one.a[2][1]=2,one.a[3][1]=2,one.a[4][1]=3;
        one.a[1][2]=3,one.a[2][2]=3,one.a[3][2]=2,one.a[4][2]=2;
        one.a[1][3]=2,one.a[2][3]=3,one.a[3][3]=3,one.a[4][3]=2;
        one.a[1][4]=2,one.a[2][4]=2,one.a[3][4]=3,one.a[4][4]=3;
        while(~scanf("%lld",&n))
        {
            mat=one;
            mtt=qpow(n-1);
            ans=3*mtt.a[1][1]+3*mtt.a[2][1]+2*mtt.a[3][1]+2*mtt.a[4][1];
            ans%=mod;
            printf("%lld
    ",ans);
        }
        return 0;
    }
    

      

  • 相关阅读:
    Idea 一些常用的小工具
    玩转SpringBoot之定时任务详解
    mysql 创建自定义函数
    mysql
    一段mysql脚本,生成一些随机数时使用。
    mysql 命令行常用操作与mysql too many connections 解决方法
    如何获取多个分组之后的第一条数据
    Linux aliyun ECS CentOS8 服务器安装Redis 部署集群 ,JDK安装与Tomcat配置
    Redis 各个版本下载地址
    centos7安装mysql5.7(rpm安装版)与 Mysql 权限
  • 原文地址:https://www.cnblogs.com/SDUTNING/p/10235253.html
Copyright © 2020-2023  润新知