先前写好了代码,本机可以正确运行了,但是一交就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
****************************************************************/