zoukankan      html  css  js  c++  java
  • 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;
    }

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

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

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

  • 相关阅读:
    线程池的工作原理
    并发处理之master-worker 模式
    Parrot os引导修复
    使用datax mongodb导数据到postgresql数据库遇到访问权限问题
    10、Flink高可用HA
    9、Standalone集群测试运行
    8、Flink Standalone工作流程
    7、Flink Local模式安装部署
    java读取word文档的文字内容
    对文件内容就行修改-java代码
  • 原文地址:https://www.cnblogs.com/plank-george-zzo/p/3222390.html
Copyright © 2011-2022 走看看