vlambda博客
学习文章列表

等级考试专题五:CSP-J 2020复赛第二题题解(桶排序的应用)

       桶排序的思想是若待排序的值在一个明显有限范围内(整型)时,可设计有限个有序桶,待排序的值装入对应的桶(当然也可以装入若干个值),桶号就是待排序的值,顺序输出各桶的值,将得到有序的序列。 

   桶排序的编程思路:首先找到数组中的最大值,然后新建一个数组a,数组的长度至少为数组最大值+1,其实新建的这个数组中的下标值就是原数组的数据值。
找到最大值后,开始遍历原数组,把原数组的数据加入数组的下标中,a[i],每当有1个i,a[i]的值就加一, 然后已经装入桶后, 遍历桶,如果a[j]位置大于0,就说明此下标有数据,也就是说,此下标在原数组里有这个值,然后排序就是从大到小。

例:输入n个0到100之间的整数,由小到大排序输出。


刚刚结束的2020年csp-j2 复赛的第二题《直播获奖(live)》就可以使用桶排序的方法来解。

等级考试专题五:CSP-J 2020复赛第二题题解(桶排序的应用)

      仔细分析下题目给出的数据发现,本题的数据数量达到了100000,但所有的成绩全部分布在 0 ~ 600 之间,所以可以使用桶排序。思路就是将数据分为 0 ~ 600 这 601 个点,每次得到成绩后,对应点数据加一,这样搜索过程就变成在一个有限范围 [0, 600] 进行查找。

     本题另一个需要值得注意的地方题面中已经给出了提示,为避免double或者float型变量计算中5*60%可能为2.999999,也可能为3.00001,导致向下取整后的结果不确定。使用整型变量,以计算出准确值。

参考程序如下:

#include <bits/stdc++.h>

using namespace std;

int score[601];

int main()

{

   int n,w,x,t;       

    //freopen("live.in","r",stdin);  

    //freopen("live.out","w",stdout);

   cin>>n>>w;

   for (int i=1; i<=n; i++)

         {

       cin>>x;

       score[x]+=100;

       t=max(100, i*w);

       for (int j=600; j>=0; j--)

                   {

           t-=score[j];

           if (t<100)

                            {

                cout<<j<<"";

                break;

           }

       }

    }

   return 0;

}








相关编程技术和学习等方面的问题请联系下方老师咨询