题意: 给你 N*M 个数
找出所有出现次数第二多的数, 并且按照从小到大顺序输出
本题要点: 排序的大水题
1、数据很小,直接开数组,存每个 ranking 的出现次数
2、对结构体进行排序,输出的是 nodes.cnt (出现次数) 第二多的 所有的 ranking
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int MaxLen = 10010;
int cnt[MaxLen];
const int MaxN = 510;
int n, m;struct node
{
int cnt; // 次数int score; // 分数
}nodes[MaxN * MaxN];bool cmp(const node& a, const node& b)
{
if(a.cnt != b.cnt){
return a.cnt > b.cnt;}return a.score < b.score;
}int main()
{
int player;while(scanf("%d%d", &n, &m) != EOF){
memset(cnt, 0, sizeof(cnt));if(n == 0 && m == 0){
break;}for(int i = 0; i < n; ++i){
for(int j = 0; j < m; ++j){
scanf("%d", &player); cnt[player]++;}}int indx = 0;for(int i = 1; i < MaxLen; ++i){
if(cnt[i]){
nodes[indx].cnt = cnt[i];nodes[indx++].score = i;}}sort(nodes, nodes + indx, cmp);int k = 0;while(k < indx && nodes[k].cnt == nodes[0].cnt){
++k;}printf("%d", nodes[k].score);for(int i = k + 1; i < indx; ++i){
if(nodes[i].cnt == nodes[i - 1].cnt){
printf(" %d", nodes[i].score);}else{
break;}}printf("\n");}return 0;
}/* 4 5 20 33 25 32 99 32 86 99 25 10 20 99 10 33 86 19 33 74 99 32 3 6 2 34 67 36 79 93 100 38 21 76 91 85 32 23 85 31 88 1 0 0 *//* 32 33 1 2 21 23 31 32 34 36 38 67 76 79 88 91 93 100 */