开始: 2024-05-12 14:30:00

20240512

结束: 2024-05-12 17:30:00
当前: 2025-0505-3131 11:49:13  类型:单人排位赛 状态:已经结束 

A-报数

#include <bits/stdc++.h>
using namespace std;
int a[2000010];
int main ()
{
int n,m;
cin>>n>>m;
for(int i=1; i<=n; i++) cin>>a[i];
for(int i=1; i<=m; i++)
{
int x;
cin>>x;
cout<<a[x]<<endl;
}
return 0;
}

B-评分

#include <bits/stdc++.h>
using namespace std;

int main()
{
double ans=0;
int n,m;
scanf("%d%d", &n, &m);
for(int i=1; i<=n; i++)
{
double sum=0;
int maxx=0,minn=11;
for(int j=1; j<=m; j++)
{
int t;
scanf("%d",&t);
sum+=t;
if(t>maxx) maxx=t;
if(t<minn) minn=t;
}
sum-=maxx+minn;
sum/=m-2;
if(sum>ans) ans=sum;
}
printf("%.2lf",ans);
return 0;
}

C-打字

一道比较简单的模拟题,主要考察读题的仔细程度和字符串处理的能力。

首先我们对26个字母打表需要按几次键盘,打表,即建立一个数组专门存储一些数据,如这道题可以这么建立:

int num[26]={1,2,3,1,2,3,1,2,3,1,2,3,1,2,3,1,2,3,4,1,2,3,1,2,3,4};        //26个字母打表需要按几次 

之后整行读入字符串,判断字母和空格即可。

#include<bits/stdc++.h>
using namespace std;
int ans;
string a;
int num[26]={1,2,3,1,2,3,1,2,3,1,2,3,1,2,3,1,2,3,4,1,2,3,1,2,3,4}; //26个字母打表需要按几次
int main()
{
getline(cin,a);//整行读入
for(int i=0;i<a.length();i++)
{
if(a[i]>='a'&&a[i]<='z') ans+=num[a[i]-'a']; //注意判断一个字符是否是字母的方法
if(a[i]==' ') ans++; //不要写else,因为可能有换行符或其他字符
}
printf("%d",ans);
return 0;
}

D-铺地毯

1. 准备4个数组,用来存储输入的地毯的坐标以及长度。

2. 从最后一个地毯开始遍历,第一个遇到的覆盖了那个点的地毯就是我们所需要的答案,没有就是-1。

#include <bits/stdc++.h>
using namespace std;
int a[101000],b[101000],c[101000],d[101000]; //分别存储坐标值和长度
int main()
{
int n;
cin>>n;
for (int i=1; i<=n; i++) scanf("%d%d%d%d",&a[i],&b[i],&c[i],&d[i]);
int num = -1;
int x,y;
cin>>x>>y;
// 从最后一个开始遍历
for (int i=n; i>=1; i--)
{
// 因为给的是长度和宽度,所以需要加上其x,y的坐标值,求其他几个点坐标的x,y值
if (a[i]<=x&&b[i]<=y&&c[i]+a[i]>=x&&d[i]+b[i]>=y)
{
num = i;
break;
}
}
cout<<num;
return 0;
}

E-约数研究

从正向思考,可以暴力求每个数有多少个约数,然后得到答案,显然这是一个O(n\sqrt{n})的算法,会运行超时,还需要进一步优化,暴力代码如下:

#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin>>n;
long long ans=0;
for(int i=1;i<=n;i++)
{
for(int j=1;j*j<=i;j++)
{
if(i%j==0)
{
ans++;
if(j!=i/j) ans++;
}
}
}
cout<<ans;
return 0;
}

从反方向思考,可以考虑每个数是多少个数的因数,比如n=12时,考虑1是12个数的因数,2是6个数的因数,3是4个数的因数,以此类推。可以发现,i是n/i个数的因数,累加即可。

#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin>>n;
int ans=0;
for(int i=1;i<=n;i++) ans+=n/i;
cout<<ans;
return 0;
}