UVALive 7077 - Song Jiang's rank list(模拟)

https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=5085

题目大意:给n个人以及每个人的名字s和他能杀死的敌人数m,将这些人按能杀死的敌人数进行排名并输出,m次查询,每次查询输出这个人的两个排名,

一个是他在他排名之前(他不能杀死,注:他不能杀死与他杀死敌人数相等的人)的人数 + 1, 一个是他排名之前与他杀死敌人数相等的人数 + 1

#include<stdio.h>
#include<string.h>
#include<math.h>
#include<stdlib.h>
#include<algorithm>

using namespace std;

const int N = 210;

struct st
{
    int m, add, same, f;
    char s[60];
} node[N], a[N];

int cmp(const void *a, const void *b)
{
    st *s1 = (st *)a , *s2 = (st *)b;
    if(s1->m != s2->m)
        return s2->m - s1->m;
    else
        return strcmp(s1->s, s2->s);
        //按字典序排列
}

int main()
{
    int n, i, j, m;
    while(scanf("%d", &n), n)
    {
        for(i = 0 ; i < n ; i++)
        {
            scanf("%s%d", node[i].s, &node[i].m);
            node[i].same = node[i].f = 0;
        }
        qsort(node, n, sizeof(node[0]), cmp);
        scanf("%d", &m);
        for(i = 1 ; i <= m ; i++)
        {
            scanf("%s", a[i].s);
            for(j = 0 ; j < n ; j++)
            {
                if(strcmp(a[i].s, node[j].s) == 0)
                    a[i].add = j;
            }
        }//a[i].add就是第i个人的排名,排名从第0名开始
        for(i = 0 ; i < n - 1 ; i++)
        {
            for(j = i + 1 ; j < n ; j++)
            {
                if(node[i].m == node[j].m)
                    node[j].same++;
            }
        }//统计他排名之前与他杀死敌人数相等的人数
        for(i = 0 ; i < n ; i++)
            printf("%s %d\n", node[i].s, node[i].m);
        for(i = 1 ; i <= m ; i++)
        {
            if(node[a[i].add].same >= 1)
                printf("%d %d\n", a[i].add - node[a[i].add].same + 1, node[a[i].add].same + 1);
            else
                printf("%d\n", a[i].add - node[a[i].add].same + 1);
        }
    }
    return 0;
}

 

posted @ 2015-10-09 17:55  午夜阳光~  阅读(198)  评论(0编辑  收藏  举报