背景介绍:本人是一枚大一新生,听说团体报名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++)
{
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平台上多刷题,多积累算法。一起加油!
有题目的小伙伴可以分享出来哦~(蟹蟹)
|