1318: 2019年内蒙古自治区第十四届大学生程序设计竞赛-花园小学运动会

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语言的同学,有不懂的地方或者可以优化的方法欢迎评论。

发布了33 篇原创文章 · 获赞 8 · 访问量 1831

猜你喜欢

转载自blog.csdn.net/HJS1453100406/article/details/103212072