EOJ 2994 数组排序 C++

写在前面:

测试样例刚过,车就到站了,,和上海持续的阴雨天气不同,济南还是一如既往的大晴天,啊我爱这干燥又温暖的春末夏初~ 吃完饭提交代码,一遍AC,爽!

题目:

  1. 数组排序

单点时限: 2.0 sec
内存限制: 256 MB
给定一个长度为 N 的整数数组,按如下规则排序并输出。首先,输出重复出现次数最多的元素;出现次数相同时,按元素值由小到大输出。例如对于数组 1 2 3 3 4 2 3 1 5 7 排序后输出 3 3 3 1 1 2 2 4 5 7。

输入格式
第 1 行:一个整数 T(1≤T≤10)为问题数。

对于每组测试数据:

第 1行是一个正整数:数组长度 N(1

第 2 行有 N 个整数:分别为第 1 至第 N个元素的值 a1,a2,⋯,an(∀i,0≤ai<500)。任意两个整数之间由一个空格分开。

输出格式
对于每个问题,输出一行问题的编号(0 开始编号,格式:case #0: 等)。

然后在一行中输出排序后的数组元素,每两个整数之间由一个空格分开,最后一个整数后面没有空格。

样例
input

3
10
9 6 3 10 3 10 6 4 3 4
10
10 9 8 7 6 5 4 3 2 1
20
4 3 7 8 6 5 8 4 2 2 7 9 5 9 6 8 6 6 3 10
output
case #0:
3 3 3 4 4 6 6 10 10 9
case #1:
1 2 3 4 5 6 7 8 9 10
case #2:
6 6 6 6 8 8 8 2 2 3 3 4 4 5 5 7 7 9 9 10

思路:

每个case中:
变量设置:

  • len 即将输入的数的个数
  • num[len] 存输入的数;
  • times[500],times[i] 代表num中数字 i 出现的次数(因为num中的数介于0 ~ 499)(记得初始化);

解题:

  • 一个len次循环,完成num[len]和times[500]的数据输入,(即完成这组数的输入,并统计数字0~499出现的次数);
  • 找到times[500]中最大元素times[i],其下标 i 就是出现次数最多的数字。循环遍历num[len],与 i 相等就输出。循环一遍之后令此时的times[i]=0;
  • 循环上一步骤,直至times[500]中最大元素为0。
  • 因为max_element找到的是第一个最大元素,也就是说最大元素不止一个时,max_element找到的是下标最小的,无形中满足了 “出现次数相同时,按元素值由小到大输出” 的要求。

P.S.
max_element很好用w,比自己写快多了。
参考博客:max_element和min_element的用法

代码:

#include<iostream>
#include<algorithm>
using namespace std;

int main(){
    int cas;
    cin>>cas;
    for(int n=0;n<cas;n++){
        int times[500]={0};
        int len;
        cin>>len;
        int num[len];

        for(int i=0;i<len;i++){
            cin>>num[i];
            times[num[i]]++;
        }
        cout<<"case #"<<n<<":"<<endl;

        while(1){
            for(int i=0;i<len;i++){
                if(num[i]==(max_element(times,times+500))-times)
                    cout<<num[i]<<" ";
            }
            *max_element(times,times+500)=0;
            if(*max_element(times,times+500)==0){
                cout<<endl;
                break;
            }
        }
    }
}

题后感:

这题其实有丶绕,,但素一遍过,有种蜜汁成就感,,

plus:回家真舒服!!

——2019.5.1 14点20分 于家中床上

你可能感兴趣的:(大一下,EOJ)