【USACO3.2】解题报告
前言
这次终于没有真香了
这一章一共有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 360的时间。
对于任意一个时间,我们计算出每一个孔现在所在的位置,用表示齿轮在第度是否通光。
把数组标记好之后就枚举每一度,如果这一度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
思路:
先一波数竞用数竞做。
由于只有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
都不知道多久之前写的了。。。现在看来就是一个非常基础的。
可以不用的。直接用8维数组搞定。。。
USACO3.2.7 Sweet Butter
题解 https://blog.csdn.net/SSL_ZYC/article/details/80921478
一个很简单的最短路。
后记
我真的是最菜的