题目类型 简单题
题目意思
输入 n (1 <= n <=50, 且 n 为偶数) 支足球队的队名和各个队与其他队比赛一场后的比分, 按字典序输出最终排在前面 n / 2支队的队名
排名首先看得分情况 (比赛结果中 赢的一方得3分 输的一方得0分 | 平手情况两队各得一分)
如果得分相同就看 (进球数 - 失球数) 的值, 如果还是相同就看进球数 (都是大的排在前面)
解题方法
成功输入数据后, 统计数据, 最后排序输出即可 (详情看代码)
附 :
参考代码 - 有疑问的地方在下方留言 看到会尽快回复的
#include <iostream> #include <cstdio> #include <cstring> #include <map> #include <set> #include <algorithm> using namespace std; char str[100][100]; char s[100]; char s1[100], s2[100]; struct P { string name; int s; int w, l; }p[110]; bool cmp(const P & a, const P & b ) { if(a.s == b.s) { if(a.w - a.l == b.w - b.l) { return a.w > b.w; } else return a.w - a.l > b.w - b.l; } return a.s > b.s; } bool cmp2(const P & a, const P & b) { return a.name < b.name; } int main() { int n, a, b; while(scanf("%d", &n) != EOF) { map<string,int>mm; map<string,int>w; map<string,int>l; set<string>name; set<string>::iterator ps; for( int i=0; i<n; i++ ) { scanf("%s", str[i]); } for( int i=0; i<n*(n-1)/2; i++ ) { scanf("%s", s); int len = strlen(s), k1 = 0, k2 = 0; bool f = 0; for( int i=0; i<len; i++ ) { if(s[i] == '-') { f = 1; continue; } if(f) s2[k2++] = s[i]; else s1[k1++] = s[i]; } s1[k1] = '\0', s2[k2] = '\0'; scanf("%d:%d", &a, &b); string ts1 = s1; string ts2 = s2; if(name.find(ts1) == name.end()) name.insert(ts1); if(name.find(ts2) == name.end()) name.insert(ts2); w[ts1] += a; l[ts1] += b; w[ts2] += b; l[ts2] += a; if(a > b) mm[ts1] += 3; else if(a == b) mm[ts1]++, mm[ts2]++; else mm[ts2] += 3; } int k = 0; for( ps=name.begin(); ps != name.end(); ps++ ) { p[k].name = *ps; p[k].s = mm[*ps]; p[k].w = w[*ps]; p[k].l = l[*ps]; k++; } sort(p, p + k, cmp); sort(p, p + n/2, cmp2); for( int i=0; i<n/2; i++ ) cout<<p[i].name<<endl; } return 0; }