zoukankan      html  css  js  c++  java
  • 【USACO3.2】解题报告

    前言

    这次终于没有真香了qwqqwq
    这一章一共有6道题目,其中2道是以前做过的。
    题目还是比较简单。恐怕要到第4或5章才开始难一些。
    USACO:https://train.usaco.org/usacogate


    USACO3.2.1 Factorials

    思路:

    沙雕模拟题我还能说什么?
    把末尾的0弄掉再进行下一个阶乘。

    代码:

    #include <cstdio>
    using namespace std;
    typedef long long ll;
    
    ll n,ans=1;
    
    int main()
    {
        scanf("%lld",&n);
        for (register ll i=1;i<=n;i++)
        {
            ans*=i;
            while (!(ans%10)) ans/=10;
            ans%=10000000000;
        }
        while (!(ans%10)) ans/=10;
        printf("%lld",ans%10);
        return 0;
    }
    

    USACO3.2.3 Stringsobits

    思路:

    又是一道沙雕题目。
    有点类似康拓展开的方法。不解释。

    代码:

    /*
    ID:ssl_zyc2
    TASK:kimbits
    LANG:C++
    */
    #include <cstdio>
    #include <cstring>
    using namespace std;
    typedef long long ll;
    
    ll f[50][50],n,m,k;
    
    int main()
    {
        //freopen("kimbits.in","r",stdin);
        //freopen("kimbits.out","w",stdout);
        scanf("%lld%lld%lld",&n,&m,&k);
        f[0][0]=1;
        for (int i=1;i<=n;i++)
            for (int j=0;j<=i;j++)
            {
                if (j) f[i][j]=f[i-1][j]+f[i-1][j-1];
                    else f[i][j]=f[i-1][j];
            }
        for (int i=0;i<=n;i++)
            for (int j=1;j<=m;j++)
                f[i][j]+=f[i][j-1];
        for (;n;n--) 
        {
            if (f[n-1][m]<k)
            {
                k-=f[n-1][m];
                putchar(49);
                m--;
            }
            else putchar(48);
        }
        return 0;
    }
    

    USACO3.2.4 Spinning Wheels

    思路:

    又是一道沙雕模拟。
    由于在360秒后所有情况都会出现,所以就枚举0 sim 360的时间。
    对于任意一个时间,我们计算出每一个孔现在所在的位置,用vis[i][j]vis[i][j]表示齿轮ii在第jj度是否通光。
    visvis数组标记好之后就枚举每一度,如果这一度5个轮子同时通光,就输出答案。

    代码:

    #include <cstdio>
    #include <cstring>
    using namespace std;
    
    int v[6],sum[6],w[6][6][3];
    bool vis[6][400];
    
    bool check()
    {
        for (int i=0;i<360;i++)
            if (vis[1][i]&&vis[2][i]&&vis[3][i]&&vis[4][i]&&vis[5][i]) return 1;
        return 0;
    }
    
    int main()
    {
        for (int i=1;i<=5;i++)
        {
            scanf("%d%d",&v[i],&sum[i]);
            for (int j=1;j<=sum[i];j++)
            {
                scanf("%d%d",&w[i][j][1],&w[i][j][2]);
                for (int l=0;l<=w[i][j][2];l++)
                    vis[i][(l+w[i][j][1])%360]=1;
            }
        }
        for (int k=0;k<=360;k++)
        {
            if (check()) return !printf("%d
    ",k);
            memset(vis,0,sizeof(vis));
            for (int i=1;i<=5;i++)
                for (int j=1;j<=sum[i];j++)
                {
                    w[i][j][1]=(w[i][j][1]+v[i])%360;
                    for (int l=0;l<=w[i][j][2];l++)
                        vis[i][(l+w[i][j][1])%360]=1;
                }
        }
        printf("none
    ");
        return 0;
    }
    

    USACO3.2.5 Feed Ratios

    思路:

    orzorz一波数竞dalaodalao用数竞做。
    由于只有3中配料,所以可以考虑dfsdfs每一种配料的数量。
    这样的复杂度是O(1003)O(100^{3})
    然后判断一下是否成立就可以了。注意0的情况。

    代码:

    #include <cstdio>
    #define A a[0][1]
    #define B a[0][2]
    #define C a[0][3]
    using namespace std;
    
    int a[4][4],ans[4];
    bool flag;
    
    bool check(int x,int y,int z)
    {
        int k=-1;
        if (A) k=x/A;
        if (B) k=y/B;
        if (C) k=z/C;
        if (k<0)
        {
            if (!x&&!y&&!z) return 1;
            return 0;
        } 
        else
        {
            if (A*k==x&&B*k==y&&C*k==z&&x>=A&&y>=B&&z>=C) return 1;
            return 0;
        }
    }
    
    void dfs(int x,int s1,int s2,int s3)
    {
        if (x==4)
        {
            if (check(s1,s2,s3))
            {
                printf("%d %d %d %d
    ",ans[1],ans[2],ans[3],s1/a[0][1]);
                flag=1;
            }
            return;
        }
        for (int i=0;i<=100;i++)
        {
            ans[x]=i;
            dfs(x+1,s1+a[x][1]*i,s2+a[x][2]*i,s3+a[x][3]*i);
            if (flag) return;
        }
    }
    
    int main()
    {
        for (int i=0;i<=3;i++)
            scanf("%d%d%d",&a[i][1],&a[i][2],&a[i][3]);
        dfs(1,0,0,0);
        if (!flag) printf("NONE
    ");
        return 0;
    }
    

    USACO3.2.6 Magic Squares

    题解 https://blog.csdn.net/SSL_ZYC/article/details/79472430

    都不知道多久之前写的了。。。现在看来就是一个非常基础的bfsbfs
    可以不用hashhash的。直接用8维数组搞定。。。


    USACO3.2.7 Sweet Butter

    题解 https://blog.csdn.net/SSL_ZYC/article/details/80921478

    一个很简单的最短路。


    后记

    我真的是最菜的

  • 相关阅读:
    luogu1210 回文检测
    luogu2420 让我们异或吧
    luogu4151 最大XOR和路径
    线性基
    博弈论(扯淡)
    矩阵求逆 模板
    luogu2513 逆序对数列
    洛谷4316 绿豆蛙的归宿(DAG递推/概率dp)
    1898: [Zjoi2005]Swamp 沼泽鳄鱼
    矩阵
  • 原文地址:https://www.cnblogs.com/hello-tomorrow/p/11998212.html
Copyright © 2011-2022 走看看