POJ 2092 Grandpa is Famous 结构体的巧妙运用

http://poj.org/problem?id=2092

根据题目给出的信息可以算出题目的数据不会很大,因为是对每个玩家统计次数,所以想到达标的方法,但是怎么打表?因为打表之后又有两次排序,所以想到使用结构体

#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
#define M 10010
#define mem0(f) memset(f,0,sizeof(f))
struct players
{
int xuhao;//保存序号
int point;//保存得分,按得分排序,
}play[M];
bool cmp(players a,players b)
{
return a.point>b.point;
}
bool cmpp(players a,players b)
{
return a.xuhao<b.xuhao;
}
int n,m,t;
int main()
{
while(~scanf("%d%d",&n,&m))
{
mem0(play);
if(!n&&!m)break;
while(n--)
{
for(int i=0;i<m;i++)
{
scanf("%d",&t);
play[t].point++;
play[t].xuhao=t;
}
}
sort(play,play+M,cmp);
int i;
for(i=1;i<M;i++)
{
if(play[i].point!=play[0].point)
break;
}
int k;
for(k=i+1;k<M;k++)
{
if(play[k].point!=play[i].point)break;
//printf(" %d",play[k].xuhao);
}
sort(play+i,play+k,cmpp);
printf("%d",play[i].xuhao);
for(int z=i+1;z<k;z++)
{
printf(" %d",play[z].xuhao);
}
putchar(' ');
}
return 0;
}

算法的核心是模拟,按照题目要求模拟出玩家的各项参数,标号和得分,因此使用结构体。

这样即使用了第一次快排,我的数据还全部保存着没有丢失,玩家的序号都在架构体内部有备份,虽然结构体元素的下标改变了成为,但是内部的序号始终记录着玩家的编号。

另外的一个好处是,题目很讨嫌,它要求并列的玩家按编号从小到大输出,这样要排两次序。使用了结构体,我就可以大大简化了,第二次排序只要对结构体的另外一个成员变量写一个比较函数就行了,方便快捷。

原文地址:https://www.cnblogs.com/plank-george-zzo/p/3222390.html