当前位置: 代码迷 >> 综合 >> POJ 2092 Grandpa is Famous 排序(水题)
  详细解决方案

POJ 2092 Grandpa is Famous 排序(水题)

热度:8   发布时间:2023-12-13 19:58:05.0

题意: 给你 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 */