POJ 2092 Grandpa is Famous 排序(水题)

题意: 给你 N*M 个数
找出所有出现次数第二多的数, 并且按照从小到大顺序输出

本题要点: 排序的大水题
1、数据很小,直接开数组,存每个 ranking 的出现次数
2、对结构体进行排序,输出的是 nodes.cnt (出现次数) 第二多的 所有的 ranking

#include 
#include 
#include 
#include 
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
*/

你可能感兴趣的:(排序,POJ,水题)