您的位置:首页 > 其它

ACM新生选拔赛第三场题解

2016-10-14 21:22 330 查看
这是2016.10.14HRBUST软件学院ACM集训队第三次选拔赛的题解。

首先今天的题目与前两次比较的话是比较简单的,单由于是英文的原因,可能看起来会比较难一点。

废话不多说,切入正题。

A题:Average

题意:给你12个浮点数,让你求平均值

#include<stdio.h>

int main()
{
double a[15];
while(~scanf("%lf",&a[0]))
{
double sum=a[0];
for(int i=1;i<12;i++)
{
scanf("%lf",&a[i]);
sum+=a[i];
}
printf("$%.2lf\n",sum/12.0);
}
return 0;
}


B题: Brainer

题意:比较大小然后按照规则输出

#include<stdio.h>

int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int a,b;
scanf("%d%d",&a,&b);
if(a>=b)
{
printf("MMM BRAINS\n");
}
else
{
printf("NO BRAINS\n");
}
}
return 0;
}


C题:Cow

就是求第一个数的每一位分别乘以第二个数的每一位的结果。

#include<stdio.h>

int main()
{
int a,b;
while(~scanf("%d%d",&a,&b))
{
int s[105],s1[105],sum1=0,sum2=0,sum=0;
while(a)
{
s[sum1++]=a%10;
a/=10;
}
while(b)
{
s1[sum2++]=b%10;
b/=10;
}
for(int i=0;i<sum1;i++)
{
for(int j=0;j<sum2;j++)
{
sum+=s[i]*s1[j];
}
}
printf("%d\n",sum);
}
return 0;
}


D题: Dirichlet

求一个序列中的第n个素数是多少

#include<stdio.h>

bool isprime(int n)
{
if(n==1)
{
return 0;
}
for(int i=2;i*i<=n;i++)
{
if(n%i==0)
{
return false;
}
}
return true;
}

int f[1000005];
int main()
{
int n,m,k;
while(~scanf("%d%d%d",&n,&m,&k))
{
if(n==0&&m==0&&k==0)
{
break;
}
int sum=0;
f[1]=n;
//f[2]=m;
int num=0;
if(isprime(f[1]))
{
sum++;
num=f[1];
}
if(sum==k)
{
printf("%d\n",num);
continue;
}
for(int i=2;i<=1000002;i++)
{
f[i]=f[1]+(i-1)*m;
if(isprime(f[i]))
{
sum++;
num=f[i];
}
if(sum==k)
{
break;
}
}
printf("%d\n",num);
}
return 0;
}


E题:Engage

简单题目,让求平局的比赛场数

思路:赢一场加3分,平一场双方每人加1分。只需计算所有人的总分,然后用场数乘以3-总分就OK 了。至于为什么的话自己思考下。

#include<stdio.h>

int main()
{
char a[205][205];
int num[205],n,m;
while(~scanf("%d%d",&n,&m))
{
if(n==0)
{
break;
}
int sum=0;
for(int i=0; i<n; i++)
{
scanf("%s %d",&a[i],&num[i]);
sum+=(num[i]);
}
printf("%d\n",m*3-sum);
}
return 0;
}


F题:Frog

找相同字母之间的最小的距离(无论是哪个字母)

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;

int main()
{
char a[1005];
int t,iCase=0;
scanf("%d",&t);
while(t--)
{
scanf("%s",a);
int minn=10005;
int l=strlen(a);
for(int i=0;i<l;i++)
{
for(int j=i+1;j<l;j++)
{
if(a[i]==a[j])
{
minn=min(minn,j-i);
break;
}
}
}
if(minn==10005)
{
printf("Case #%d: -1\n",++iCase);
}
else
printf("Case #%d: %d\n",++iCase,minn);
}
return 0;
}


G题:Game

比较难的推论题。

推出来后只有一个公式就OK了。

#include <stdio.h>

int main()
{
int T=0, p, n, q;
while(~scanf("%d%d%d", &n, &p, &q))
{
printf("Case %d: %.4f\n", ++T, (q+1.0)/(p+2.0));
}
return 0;
}


H题: Harness

给一个方阵,然后这个方阵你需要旋转90度 180度270 度,然后每一次旋转都要与最初的矩阵进行匹配,最后的输出为:在相同位置值一样的数的个数的最大值(旋转3次)

#include<stdio.h>
#include<algorithm>
using namespace std;

int a[35][35],b[35][35],c[35][35],d[35][35],e[35][35];
int n;
int judge1()//90度
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
c[n-j+1][n-i+1]=b[i][n-j+1];
}
}
int re=0;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(a[i][j]==c[i][j])
{
re++;
}
}
}
return re;
}

int judge2()
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
d[n-j+1][n-i+1]=c[i][n-j+1];
}
}
int re=0;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(a[i][j]==d[i][j])
{
re++;
}
}
}
return re;
}

int judge3()
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
e[n-j+1][n-i+1]=d[i][n-j+1];
}
}
int re=0;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(a[i][j]==e[i][j])
{
re++;
}
}
}
return re;
}

int main()
{
while(~scanf("%d",&n))
{
if(n==0)
{
break;
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
scanf("%d",&a[i][j]);
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
scanf("%d",&b[i][j]);
}
}
int sum=judge1();
sum=max(sum,judge2());
sum=max(sum,judge3());
printf("%d\n",sum);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  acm