1318: 2019年内蒙古自治区第十四届大学生程序设计竞赛-花园小学运动会
题目描述
花园小学正在进行紧张刺激的运动会!每个班级都有一个独一无二的数字。现在正是 10000 米短跑比赛的现场。许多班级的运动员们已经纷纷准备就绪。正等一声令下,开始比赛。10000 米短跑比赛有一个传统,就是每当一个运动员跑到终点时,都会大声喊出他的班级号,来显示一种荣耀。现在,给出 n 个数,代表通过终点的 n 个人所喊出的班级号,你需要统计有多少班级在这场比赛中参赛了正好 k 个人,计算出在这些班级中,获得第一名的选手是哪个班级的。输出他所在的班级号。
假设每一个参加比赛的人都通过了终点。
输入
每组数据第一行,n,k。代表有 n 个人,要求保留 k 个人的班。(n,k<=1000000)
接下来一行 n 个数,依次代表选手通过终点所喊出的班级号(a[1]代表第一个通过终点的选手喊出的班级号,依次类推)。 (a[i]<=1000000)
处理到文件结束。
输出
每行一个数。
若没有班级通过 k 人,输出-1。
样例输入
5 2
4 2 3 2 3
样例输出
2
这道题目的题干不是很难,考点在于对动态空间的使用和一点大数问题的理解,当时不会用动态空间分配,这道题之间PASS,赛后查阅一些资料,写出以下解法。
#include <stdio.h>
int main()
{ int *arr,*arr1,f;//指针和数组之间的关系很有意思,某种角度来说他们是同一概念的
long n,k,i,p;
while(scanf("%ld%ld",&n,&k)!=EOF)
{ arr = (int*)malloc(10000005 * sizeof(int));//很好用的动态空间分配
arr1 = (int*)malloc(10000005 * sizeof(int));
f=0;
for(i=0;i<n;i++)
{ scanf("%ld",&p);
arr1[i]=p;
arr[p]++;
}
for(i=0;i<n;i++)
{ if(arr[arr1[i]]==k) {printf("%d\n",arr1[i]);f=1;break;}}
if(f==0) printf("-1\n");
free(arr);//不释放空间的话,会造成类似“风暴”的产生
free(arr1);
}
return 0;
}
有意思的是,当把空间定义的足够大的时候,运行时间会减少,反之也是一样,这种“以空间换时间”的现象在计算机中很常见。
代码不是很优,但是目前CSDN上比较简单的C语言基础版,适合刚刚入门C语言的同学,有不懂的地方或者可以优化的方法欢迎评论。