题目大意:给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; }
UVALive 7077 - Song Jiang's rank list(模拟)
时间: 2024-10-12 18:54:37