PTA:又见胜局排序

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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值