第24次CCF计算机软件能⼒认证C语⾔第⼀题100分题解,第
⼆题70分题解以及经验分享
背景介绍:本⼈是⼀枚⼤⼀新⽣,听说团体报名csp⽐赛⽐个⼈便宜,(确实,个⼈报名需要好⼏百,我们学校团体报名只收50),于是抱着试⼀试积累经验的⼼态报名了本次认证。才接触指针就参加⽐赛了,⼼想着会是⼀场“坐牢”,结果竟然做出来⼀两题,特此发帖分享⼀下题解和⼀些经验。
⾮常抱歉的⼀件事情是:我没到题⽬描述,在csp官⽹⾥好像还没有发布。。。(希望有知道的⼩伙伴可以分享⼀下)
/*作者:Foge.C
时间:2021.12.05
编译语⾔:C语⾔
编译环境:codeblocks*/
#include <stdio.h>
#include <stdlib.h>
int f(int*,int,int);/*函数原型*/
int main()
{/*接受输⼊*/
int n,N;
scanf("%d %d",&n,&N);
int i=0,A[n+1],sum=0;
A[0]=0;
for(i=1;i<n+1;i++)
{
scanf("%d",&A[i]);
}
/*计算值并求和*/
for(i=1;i<n+1;i++)
{
sum+=f(A,n+1,A[i-1])*(A[i]-A[i-1]);
}
sum+=f(A,n+1,A[n])*(N-A[n]);
/*显⽰结果*/
printf("%d",sum);
return 0;
}
int f(int arr[],int len,int x)
{/*这个函数⽤于计算题⽬中的函数关系*/
/*arr为数组,len为数组长度,x为⾃变量*/
/*返回f(x)的值*/
int i,ans;
for(i=0;i<len;i++)
{
if(arr[i]<=x)
ans=i;
}
return ans;
}
ps:这⾥的注释是发帖时加上去的,正式⽐赛时提交的代码注释是不能含有中⽂的。
先前做出的题解在计算值并求和那⼀步⽤的纯加法,没有把相同的项⽤乘法做出来,结果只通过了前5个测试点(也就是50分),原因可想⽽知,算法超时限了,⽐赛试题有运⾏时间限制,就像洛⾕那样。其实题⽬中已经提供了相同项⽤乘法的算法思路,还是⽐较友善的。改进算法后提交就满分了。
同⼀道题可以提交多次,最多32次,取得分最⾼的⼀次计分,建议是先在编译器上编译好并且⾃⼰测试⼏次再提交到⽹页上。还有就是建议不要反复提交相同的代码,当时考场上有同学提交后没有⽴马出测试结果,就反复提交,这种做法是不可取的,因为参加认证的⼈很多,这个线上测评的服务器反应不过来,反复提交有点浪费资源,相同的代码你提交⼀次就够了,你也可以多次提交不同算法的代码买个保险。运⽓好的话,在考试结束前可以看见代码分数和测试点通过与否,看不见也不⽤担⼼,考试结束后服务器还是会继续把每⼀个考⽣的每⼀次提交的代码测试并予以评分。
这是我第⼀次提交的50分代码:
/*作者:Foge.C
时间:2021.12.05
编译语⾔:C语⾔
编译环境:codeblocks*/
#include <stdio.h>
#include <stdlib.h>
int f(int*,int,int);
int main()
{
int n,N;
scanf("%d %d",&n,&N);
int i=0,A[n+1],sum=0;
A[0]=0;
for(i=1;i<n+1;i++)
{
scanf("%d",&A[i]);
}
for(i=1;i<n+1;i++)
{
sum+=f(A,n+1,A[i]);/*此处算法太慢*/
}
printf("%d",sum);
return 0;
}
int f(int arr[],int len,int x)
{
int i,ans;
for(i=0;i<len;i++)
{
if(arr[i]<=x)
ans=i;
}
return ans;
}
第⼆题是建⽴在第⼀题的基础上,只要你第⼀题做出来的,第⼆题加⼀点东西就⾏了,但是我是建⽴在第⼀题那个50分代码上的,也还是算法超时问题,得了70分。
/*作者:Foge.C
时间:2021.12.05
编译语⾔:C语⾔
编译环境:codeblocks*/
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int f(int*,int,int);
int g(int,int);/*函数原型*/
int main()
{/*接受输⼊*/
int n,N,r;
scanf("%d %d",&n,&N);
r=N/(n+1);/*第⼆题新增的⽐列系数,公式题⽬已给出*/
int i=0,A[n+1],error=0,x=0;
A[0]=0;
for(i=1;i<n+1;i++)
{
编写c语言的软件scanf("%d",&A[i]);
}
/*计算值并求和*/
for(x=0;x<N;x++)
{
error+=abs(g(x,r)-f(A,n+1,x));/*abs()表⽰求绝对值*/
}
printf("%d",error);
return 0;
}
int f(int arr[],int len,int x)
{/*这是第⼀题的f(x)函数*/
int i,ans;
for(i=0;i<len;i++)
{
if(arr[i]<=x)
ans=i;
}
return ans;
}
int g(int x,int r)
{/*这是第⼆题题⽬中描述的函数*/
return x/r;
}
做到这就开始“坐牢”了,后⾯的题看都看不懂,第三题是⼀个弄什么417码的,题⽬描述特长,⽹页上看得还挺⿇烦,我的⽔平还不会做(同考场的学长⼤佬已经杀疯了,哈哈)。题⽬都是⽐较贴近现实的,是实际可⽤的,还是⽐较有意思。
总之,这次csp是⼀次宝贵的经验,以后有机会还会再尝试⼀下,趁现在⼤⼀,还是新⼿,好好努⼒⼀把,可以冲⼀冲的。(我就是个混⼦。。。)
其他想要尝试的⼩伙伴可以多在洛⾕,⼒扣这些OJ平台上多刷题,多积累算法。⼀起加油!
有题⽬的⼩伙伴可以分享出来哦~(蟹蟹)