九度OJ--1007-奥运排序问题

先前写好了代码,本机可以正确运行了,但是一交就WA,原因在于,我把所有国家的数据进行排名了,然后再打印出来,这样是不对的,当数据多时,打印出来的名次一定会出错的,因为题目要求只是给M个国家排名而已,而不是对N个国家。问题就出在这里,后面改了回来,就可以运行了,代码有点长。。。。。。重复代码比较多
#include <stdlib.h>
#include <stdio.h>
 
typedef struct Nation{
    int m_num;  //国家代号
    int m_gold; //金牌数
    int m_medal;//奖牌数
    int m_people;//人口数
    int *m_rank;//名次列表
}Nation;
 
static int N;//国家数
static int M;//参排国家数
 
static void SWAP(Nation* a, Nation* b)
{
    int num;  //国家代号
    int gold; //金牌数
    int medal;//奖牌数
    int people;//人口数
    int *rank;//名次列表
 
    num    = a->m_num;
    gold   = a->m_gold;
    medal  = a->m_medal;
    people = a->m_people;
    rank   = a->m_rank;
 
    a->m_num    = b->m_num;    
    a->m_gold   = b->m_gold;   
    a->m_medal   = b->m_medal;    
    a->m_people  = b->m_people;   
    a->m_rank    = b->m_rank;
 
    b->m_num    = num ;  
    b->m_gold   = gold ; 
    b->m_medal   = medal ;
    b->m_people  = people;
    b->m_rank    = rank  ;
 
}
//对国家号进行排序,从小到大
void sort_num(Nation *nations, int m)
{
    int i,j;
    int index,min;
 
    for (i = 0; i < m; ++i)
    {
        min = nations[i].m_num;
        index = i;
        for (j = i+1; j < m; ++j)
        {
            if (min > nations[j].m_num)
            {
                min = nations[j].m_num;
                index = j;
            }
        }
        if (index != i)
            SWAP(nations + i, nations + index);
    }
}
//对金牌进行排序
void sort_0(Nation *nations, int m)
{
    int i,j;
    int index,max;
    int count = 1;
 
    for (i = 0; i < m; ++i)
    {
        max = nations[i].m_gold;
        index = i;
        for (j = i+1; j < m; ++j)
        {
            if (max < nations[j].m_gold)
            {
                max = nations[j].m_gold;
                index = j;
            }
        }
        if (index != i)
            SWAP(nations + i, nations + index);
        //分配排名
        if (1 != count)
        {
            //比较与前一名元素值
            if ((nations[i].m_gold) == (nations[i-1].m_gold))
                (nations[i].m_rank)[0] = (nations[i-1].m_rank)[0];
            else
                (nations[i].m_rank)[0] = count;
        }
        else
            (nations[i].m_rank)[0] = 1;
 
        ++count;
    }
}
//对奖牌排序
void sort_1(Nation *nations, int m)
{
    int i,j;
    int index,max;
    int count = 1;
 
    for (i = 0; i < m; ++i)
    {
        max = nations[i].m_medal;
        index = i;
        for (j = i+1; j < m; ++j)
        {
            if (max < nations[j].m_medal)
            {
                max = nations[j].m_medal;
                index = j;
            }
        }
        if (index != i)
            SWAP(nations + i, nations + index);
        //分配排名
        if (1 != count)
        {
            //比较与前一名元素值
            if ((nations[i].m_medal) == (nations[i-1].m_medal))
                (nations[i].m_rank)[1] = (nations[i-1].m_rank)[1];
            else
                (nations[i].m_rank)[1] = count;
        }
        else
            (nations[i].m_rank)[1] = 1;
 
        ++count;
    }
}
//对金牌人数比
void sort_2(Nation *nations, int m)
{
    int i,j;
    int index;
    double max,tmp;
    int count = 1;
 
    for (i = 0; i < m; ++i)
    {
        max = (double)((nations[i].m_gold * 1.0) / nations[i].m_people);
        index = i;
        for (j = i+1; j < m; ++j)
        {
            tmp = (double)((nations[j].m_gold * 1.0) / nations[j].m_people);
            if (max < tmp)
            {
                max = tmp;
                index = j;
            }
        }
        if (index != i)
            SWAP(nations + i, nations + index);
        //分配排名
        if (1 != count)
        {
            tmp = (double)((nations[i].m_gold * 1.0) / nations[i].m_people);
            max = (double)((nations[i-1].m_gold * 1.0) / nations[i-1].m_people);;
 
            //比较与前一名元素值
            if (tmp == max)
                (nations[i].m_rank)[2] = (nations[i-1].m_rank)[2];
            else
                (nations[i].m_rank)[2] = count;
        }
        else
            (nations[i].m_rank)[2] = 1;
 
        ++count;
    }
}
//对奖牌人数比
void sort_3(Nation *nations, int m)
{
    int i,j;
    int index;
    double max,tmp;
    int count = 1;
 
    for (i = 0; i < m; ++i)
    {
        max = (double)((nations[i].m_medal * 1.0) / nations[i].m_people);
        index = i;
        for (j = i+1; j < m; ++j)
        {
            tmp = (double)((nations[j].m_medal * 1.0) / nations[j].m_people);
            if (max < tmp)
            {
                max = tmp;
                index = j;
            }
        }
        if (index != i)
            SWAP(nations + i, nations + index);
        //分配排名
        if (1 != count)
        {
            tmp = (double)((nations[i].m_medal * 1.0) / nations[i].m_people);
            max = (double)((nations[i-1].m_medal * 1.0) / nations[i-1].m_people);;
 
            //比较与前一名元素值
            if (tmp == max)
                (nations[i].m_rank)[3] = (nations[i-1].m_rank)[3];
            else
                (nations[i].m_rank)[3] = count;
        }
        else
            (nations[i].m_rank)[3] = 1;
 
        ++count;
    }
}
 
void printfRank(Nation nations)
{
    int j;
    int index;
    int min_rank;
 
     
    index = 0;
    min_rank = (nations.m_rank)[0];
    for (j = 1; j < 4; ++j)
    {
        if (min_rank > (nations.m_rank)[j])
        {
            min_rank = (nations.m_rank)[j];//最佳排名
            index = j;//排名方式
        }
    }
    printf("%d:%d\n",min_rank,index+1);
     
}
 
void printR(Nation *nations, int* select, int m)
{
    int i=0;
    int j = 0;
    while (i < m)
    {
        j = 0;
        while(j < 4)
        {
            printf("num:%d--rank:%d\n",nations[select[i]].m_num,(nations[select[i]].m_rank)[j]);
            ++j;
        }
 
        ++i;
    }
}
 
int main(int argc, char* argv[])
{
    Nation* nations,*nations_select;
    int *select;
    int i;
    while(EOF != scanf("%d %d",&N, &M))
    {
        //输入国家情况N
        nations        = (Nation*)malloc(N * sizeof(Nation));
        nations_select = (Nation*)malloc(M * sizeof(Nation));
 
        for (i = 0; i < N; ++i)
        {
             nations[i].m_rank = (int*)malloc(4 * sizeof(int));
             scanf("%d %d %d",&(nations[i].m_gold), &(nations[i].m_medal), &(nations[i].m_people));
             nations[i].m_num = i;
        }
        //输入参排国家号
        select = (int*)malloc(M * sizeof(int));
        for (i = 0; i < M; ++i)
        {
            scanf("%d",select+i);
            nations_select[i] = nations[select[i]];
        }
 
        //开始一系列的排序
        sort_0(nations_select,M);
        sort_1(nations_select,M);
        sort_2(nations_select,M);
        sort_3(nations_select,M);
        sort_num(nations_select,M);//按国家号重排国家
        //printR(nations,select,M);
        //选出参排国家
        for (i = 0; i < M; ++i)
        {
            printfRank(nations_select[ i ]);
        }
        printf("\n");
 
 
 
    }
 
 
    return 0;
}
/**************************************************************
    Problem: 1007
    User: tenyee
    Language: C
    Result: Accepted
    Time:0 ms
    Memory:916 kb
****************************************************************/

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值