链接:http://acm.hrbust.edu.cn/index.php?m=ProblemSet&a=showProblem&problem_id=1022
Description:
自从电子竞技在中国被认定为第99个正式体育项目,教主就投身其中,SC(StarCraft 星际争霸)他拿手的一款游戏,当然也有很多职业选手参与其中。
星际争霸中有3个种族:T(人族),P(神族),Z(虫族)而且每个玩家必须选择且只能选择一个种族来使用。
在职业电子竞技联赛中,每位职业选手都会固定使用某一个自己喜爱的种族。
在经过大量的比赛后,发现有如下的规律:
1.使用人族的选手总是能战胜虫族选手
2.使用虫族的选手总是能战胜神族选手
3.使用神族的选手总是能战胜人族选手
4.使用相同种族的选手对战总是产生平局
现在将告诉你每个选手的种族,并进行若干场比赛,要求你输出每场比赛的结果。
Input:
本题只有一组测试数据
第一行:N M (1 <= N, M<= 10000),N代表选手的数目,M代表比赛的场数。
接下来N行,每行首先给出选手名字(玩家的名字只由大写、小写字母、数字组成,其中没有空格,最长的名字占10个字符)接着是他的种族(用T、P、Z表示)
接下来M行,每行代表一场比赛,首先给出选手A的名字,接着给出选手B的名字。
Output:
对于每场比赛:
选手A胜利 输出"XiaoM Wins!"
选手B胜利 输出"TianT Wins!"
平局 输出"End in a draw!"
Sample Input:
4 4
JiaoZhu T
Jaedong Z
Chadalt T
LMJ Z
JiaoZhu Chadalt
Jaedong LMJ
JiaoZhu LMJ
LMJ Chadalt
Sample output:
End in a draw!
End in a draw!
XiaoM Wins!
TianT Wins!
解析代码如下:
#include <cstring> #include <cstdio> #include <iostream> using namespace std; typedef struct Competitor_ { char name[51]; char grade; }Competitor; Competitor cp[10005]; int cmp(const void *a, const void *b) { Competitor *p1=(Competitor*)a; Competitor *p2=(Competitor*)b; return strcmp(p1->name, p2->name); } int binarySearch(const Competitor cp[], int left, int right, const char key_name[]) { right--; while (left <= right) { int mid = left + (right - left) / 2; if (strcmp(cp[mid].name, key_name) > 0) { right = mid - 1; }else if(strcmp(cp[mid].name, key_name) < 0) { left = mid + 1; }else { return mid; } } } int main() { int n, m; char name1[55], name2[55]; while (scanf("%d%d", &n, &m) != EOF) { for (int i=0; i<n; i++) { scanf("%s %c", cp[i].name, &cp[i].grade); } qsort(cp, n, sizeof(cp[0]), cmp); for (int i=0; i<m; i++) { scanf("%s%s", name1, name2); int c1 = binarySearch(cp, 0, n, name1); int c2 = binarySearch(cp, 0, n, name2); if(cp[c1].grade == cp[c2].grade) { printf("End in a draw!\n"); } if(cp[c1].grade == 'T' && cp[c2].grade == 'Z' || cp[c1].grade == 'Z' && cp[c2].grade == 'P' || cp[c1].grade == 'P' && cp[c2].grade == 'T') { printf("XiaoM Wins!\n"); } if(cp[c1].grade == 'Z' && cp[c2].grade == 'T' || cp[c1].grade == 'P' && cp[c2].grade == 'Z' || cp[c1].grade == 'T' && cp[c2].grade == 'P') { printf("TianT Wins!\n"); } } } return 0; }后续解法待续:
规律:利用哈希函数将字符串映射到数组中,利用下标实现快速查找。 代码:#include<stdio.h> #include<string.h> unsigned int SDBMHash(char *str) { unsigned int hash = 0; while (*str) { hash = (*str++) + (hash << 6) + (hash << 16) - hash; } return (hash & 0x7FFFFFFF); } int main() { int a[100000]; int len, len1, len2, x, y, m, n, z; char b[11], d[11], c[2]; scanf("%d%d",&n, &m); for(int i=0; i<n; i++) { scanf("%s%s", b, c); z = SDBMHash(b)%100000; if(c[0]=='T') a[z] = 1; else if(c[0]=='Z') a[z] = 2; else a[z] = 3; } for(int i=0; i<m; i++) { x=0;y=0; scanf("%s%s",b,d); x = SDBMHash(b)%100000; y = SDBMHash(d)%100000; if(a[x]==a[y]) printf("End in a draw!\n"); else if((a[x]==1&&a[y]==2)||(a[x]==2&&a[y]==3)||(a[x]==3&&a[y]==1)) printf("XiaoM Wins!\n"); else printf("TianT Wins!\n"); } return 0; }