1705 - 中国好OJ
ACM俱乐部是一个非常好的平台,每个学校都可以来申请拥有属于自己的OJ,并且实现了题目共享和出售,使题目资源不足的问题在很大程度上得到了改善。
作为一个OJ,排名系统是一定要有的。假设ACM俱乐部对用户的排名规则如下:
先按照分数从高到低排序,如果分数一样,则按照AC题目数从多到少排序,如果AC题目数也一样,则按照用户名缩写的字典序排序,如果用户名缩写字典序也相同,则按照用户名的字典序排序。
用户名由若干单词组成,每个单词只包含小写英文字母,且由至少一个英文字母组成,单词之间由一个空格分隔。
用户名的缩写由每个单词首字母组成,例如“tian qin”的缩写是“tq”。
按照用户名字典序进行排序时,用户名中的空格应忽略,例如应将“tian qin”转换成“tianqin”,再进行排序。
Input
输入包含多组测试数据。
每组输入的第一行是一个整数N(0<=N<=100),表示用户数量。当N=0时,输入结束。
接下来N行,每行先输入两个整数a和b(0<=a,b<=1000),a表示分数,b表示AC题数,然后在同一行输入一个字符串s,表示用户名,s的长度不大于15。a,b,s三者由一个空格分隔。
输入数据保证不会出现用户名相同的情况,也不会出现a!=0,而b=0的情况。
Output
对于每组输入,输出排好序的用户信息,一个用户信息占一行,格式与输入时一致。相邻两组输出之间空一行。
Examples
Input
2 98 45 tian qin 100 40 acm club 3 88 50 tian qin 88 45 acm club 88 50 tai qiu 0
Output
100 40 acm club 98 45 tian qin 88 50 tai qiu 88 50 tian qin 88 45 acm club
Solution C++
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; struct USER { int score; int ac; char name[16]; char name1[16]; char suoxie[16]; } user[100]; bool cmp(USER a, USER b) { if (a.score == b.score) { if (a.ac == b.ac) { if (!strcmp(a.suoxie, b.suoxie)) return strcmp(a.name1, b.name1) < 0 ? 1 : 0; return strcmp(a.suoxie, b.suoxie) < 0 ? 1 : 0; } return a.ac > b.ac; } return a.score > b.score; } int main() { int n, a, b, i, k, c = 0; char s[16], *p; while (scanf("%d", &n) != EOF, n) { for (i = 0; i < n; i++) { scanf("%d%d%*c", &user[i].score, &user[i].ac); gets(s); strcpy(user[i].name, s); strcpy(user[i].name1, "\0"); p = strtok(s, " "); k = 0; while (p) { strcat(user[i].name1, p); user[i].suoxie[k++] = *p; p = strtok(NULL," "); } user[i].suoxie[k] = '\0'; } sort(user, user + n, cmp); if (c++) puts(""); for (i = 0; i < n; i++) printf("%d %d %s\n", user[i].score, user[i].ac, user[i].name); } return 0; }