2022年7月双周赛(初级班)
A-杨辉三角
不知道杨辉三角是什么的同学,可以看这个链接:https://baijiahao.baidu.com/s?id=1713736803866982758&wfr=spider&for=pc
在当前的阶段,我们只需要对杨辉三角有个大致印象即可,今后学到组合数学相关知识时会进一步阐述它的用处。
我们可以发现杨辉三角的几个特点,由此帮助我们做这道题:
- 第n行的数字有n项。
- 每行数字左右对称。
- 每行的第一个数字和最后一个数字都是1。
- 每个数等于它上方两数之和。
观察出这几个特点之后,便可以转化成代码解题:
#include<cstdio>
int a[21][21];
int main()
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
a[i][1]=a[i][i]=1;//给每行的第一个数和最后一个数赋初值
for(int i=3;i<=n;i++)//前两行都是1,已经算出来了,所以从第三行开始算
for(int j=2;j<i;j++)//因为a[i][1]、a[i][i]已经赋值过了,所以循环是2~n-1
a[i][j]=a[i-1][j]+a[i-1][j-1];//每个数等于它上方两数之和
for(int i=1;i<=n;i++)
{
for(int j=1;j<=i;j++)
printf("%d ",a[i][j]);
printf("\n");
}
}
B-标题统计
这道题非常简单,需要注意的细节是输入可能含有空格,所以要读入一整行,即用cin.getline或gets。
#include<cstdio>
#include<cstring>
using namespace std;
int main()
{
char s[10];
gets(s);
int n=strlen(s);
int ans=0;
for(int i=0;i<n;i++)
{
if(s[i]>='A'&&s[i]<='Z')
ans++;
if(s[i]>='a'&&s[i]<='z')
ans++;
if(s[i]>='0'&&s[i]<='9')
ans++;
}
printf("%d",ans);
return 0;
}
C-质数筛
按照题意,首先把数全部存在数组中,再挨着挨着判断是否是质数,若是质数则输出即可。
需要注意的是,判断质数时循环内需要采用类似i*i<=n
的判断方法,而不需要枚举到n。
暴力的素数判断可以通过此题,若同学们想了解关于质数的高级筛法,可以提前参考此链接学习(在之后普及组的内容中也会学到):https://blog.csdn.net/tktp_ht/article/details/89310614
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
using namespace std;
bool isprime(int x){//判断是否素数
if(x<=1) return false;//如果小于2,一定不是素数
for(int i=2;i*i<=x;i++){//如果有一个大于sqrt(n)的数可以被n整除,那么必有一个数n/i也可以被n整除且小于i
if(x%i==0) return false;//如果可以整除,那么不是素数
}
return true;//是素数
}
int main(){
int n,a;
cin>>n;
for(int i=1;i<=n;i++){
cin>>a;
if(isprime(a)){
cout<<a<<" ";//是素数,就输出
}
}
return 0;
}
D-歌唱比赛
这道题其实不难,但是需要同学们仔细理解题意并进行模拟,详见代码。
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,m;
double ans=0;
cin>>n>>m;
for(int i=1; i<=n; i++)
{
double score=0,minn=10,maxx=0,x;
for(int j=1; j<=m; j++)
{
cin>>x;
score+=x;
minn=min(x,minn);
maxx=max(x,maxx);
//计算当前最高分、最低分、总分
}
score = score-minn-maxx;//减去最高分和最低分
score = score/(m-2);//计算平均分
if(score>ans) ans=score;//取最大值
}
printf("%0.2f\n",ans);
return 0;
}