【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\n",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\n");
    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\n",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\n");
    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

一个很简单的最短路。


后记

我真的是最菜的

posted @ 2019-05-04 14:05  全OI最菜  阅读(121)  评论(0编辑  收藏  举报