湖南大学第十四届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;
}

  

原文地址:https://www.cnblogs.com/SDUTNING/p/10235253.html