题目类型 简单题
题目意思
输入 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;
}