n个人打乒乓球,好不热闹。已知每人各自胜了几局,请按胜局从多到少排序并输出每个人的排名rank(从1开始)、胜局数num及该人原来的输入序号index(从1开始),若num相同,则rank也相同,但输出时index小者优先输出。
输入格式:
首先输入一个正整数T,表示测试数据的组数,然后是T组测试数据。每组测试先输入人数n(不大于10),再输入n个整数(不大于30),表示各人的胜局数。
输出格式:
对于每组测试,按胜局数从多到少输出n行,每行包含三个整数,表示一个人的排名rank、胜局数num及该人原来的输入序号index。每行的每两个数据之间留一个空格。每两组测试之间留一个空行。
输入样例:
2
6 5 1 2 3 4 6
5 4 5 6 6 4
输出样例:
1 6 6
2 5 1
3 4 5
4 3 4
5 2 3
6 1 2
1 6 3
1 6 4
3 5 2
4 4 1
4 4 5
解题思路:
这道题实际上是一道排序题, 因为需要输出排序后的数据及其初始位置,那么可以先把每个数据初始位置(从1开始)存入到其对应的结构体中,这样在输出排序后的数据时,就能一起输出其初始位置。
注意:当数据相同时,其所排的位次要一样,那么可以借助一个变量K来存储其位次,当后面一个数的位次与前面一个数的位次相同时,输出的位次就是k;反之,则输出此时遍历的人数即cnt+1
对于换行的处理,可以借助输入的组数T来控制,当T不为0的时候只需再输出一个换行,因为前面输出的时候已经有了一个换行.
#include<stdio.h>
struct pm
{
int m;
int index;
};
int main()
{
int T, i, j;
scanf("%d", &T);
while(T--)
{
int n;
struct pm a[1000];
scanf("%d", &n);
for(i = 0; i < n; i++)
{
scanf("%d", &a[i].m);
a[i].index = i+1;//存入每个数据的初始位置(从1开始)
}
//排序
for(i = 0; i < n; i++)
{
for(j = 0; j < n-i-1; j++)
{
if(a[j].m < a[j+1].m)
{
struct pm t = a[j];
a[j] = a[j+1];
a[j+1] = t;
}
}
}
//输出
int cnt = 0;
int k = 1;
for(i = 0; i < n; i++)
{
if(i > 0 && a[i].m == a[i-1].m)//后面一个人胜的场数等于前一个人胜的场数
{
printf("%d %d %d\n", k, a[i].m, a[i].index);
}
else//后面一个人胜的场数不等于前一个人胜的场数
{
printf("%d %d %d\n", i+1, a[i].m, a[i].index);
k = cnt+1;//注意此时的k的变化
}
cnt++;
}
if(T != 0)
{
printf("\n");
}
}
return 0;
}