开始: 2022-07-16 17:00:00

2022年7月双周赛(初级班)

结束: 2022-07-16 19:30:00
当前: 2025-0606-0202 00:18:29  类型:OI 状态:已经结束 

A-杨辉三角

不知道杨辉三角是什么的同学,可以看这个链接:https://baijiahao.baidu.com/s?id=1713736803866982758&wfr=spider&for=pc

在当前的阶段,我们只需要对杨辉三角有个大致印象即可,今后学到组合数学相关知识时会进一步阐述它的用处。

我们可以发现杨辉三角的几个特点,由此帮助我们做这道题:

  1. 第n行的数字有n项。
  2. 每行数字左右对称。
  3. 每行的第一个数字和最后一个数字都是1。
  4. 每个数等于它上方两数之和。

观察出这几个特点之后,便可以转化成代码解题:

#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;
}