计蒜客信息学入门赛 #21足球队(逐句精解)

蒜头君是蒜厂足球争霸赛的主办人,他召集了 n 支球队共参加 q 场比赛,队伍的编号依次为 1,2,3 … n。比赛的积分规则为:

  • 胜一场,积 33 分;
  • 平一场,不积分;
  • 负一场,扣 22 分。
  • 如果积分不够扣,就会自动归零,下场比赛继续积分。

所有比赛结束后,蒜头君要给积分最高的队伍颁奖,如果有多个队伍积分相同,只颁给编号最小的队伍。那么最终获奖的是哪支队伍呢?

输入格式
输入为 q + 1 行:

第一行两个空格隔开的整数 n, q (2≤n,q≤100),分别表示队伍和比赛的数目;
接下来的 q 行,每行有 4 个空格隔开的整数,分别代表参加比赛的两支队伍的编号a,b (1≤a,b≤n,a != b) 和本场比赛的比分)s_a ,s_b (0≤s_a,s_b ≤10)。

输出格式
输出为 11 个整数,是获奖队伍的编号。

输出时每行末尾的多余空格,不影响答案正确性

样例输入
4 4
1 2 3 4
2 3 4 3
1 3 5 2
3 4 5 2
样例输出
2
样例解释
比赛结束后积分情况为:11 号队伍 33 分,22 号队伍 66 分,33 号队伍 33 分,44 号队伍 00 分,因此 22 号队伍获奖。

1、定义头文件

#include 
#include 
#include 
#include 

2、定义数据

每一个球队最开始得分为0

map<int, int> m;
for (int i = 1; i <= n; i++) {
    m[i] = 0;
}

3、输入数据

边输入边处理

int a, b, c, d;
for (int i = 0; i < q; i++) {
    cin >> a >> b >> c >> d;
    //处理
}

4、处理数据

胜一场,积 33 分;平一场,不积分;负一场,扣 22 分。

if (c == d) {		平一场
  	continue;
}
map<int, int>::iterator ia = m.find(a);
map<int, int>::iterator ib = m.find(b);
if (c > d) {
    ia->second += 3;	胜一场
    ib->second -= 2;	负一场
    if (ib->second < 0) {	如果积分不够扣,就会自动归零,下场比赛继续积分。
    	ib->second = 0;
    }
} else {            
	ib->second += 3;	胜一场
    ia->second -= 2;	负一场
    if (ia->second < 0) {	如果积分不够扣,就会自动归零,下场比赛继续积分。
    	ia->second = 0;
    }
}

5、排序数据

转化为vector进行排序

vector<pair<int, int> > v(m.begin(), m.end());
sort(v.begin(), v.end(), cmp);

6、定义排序规则

从大到小,一样的序号小的在前

bool cmp(const pair<int, int>& a, const pair<int, int>& b) {
    if (a.second == b.second) {		一样的序号小的在前
        return a.first < b.first;
    }
    return a.second > b.second;		从大到小
}

7、return 0

return 0;

完整代码

#include 
#include 
#include 
#include 

using namespace std;
map<int, int> m;
bool cmp(const pair<int, int>& a, const pair<int, int>& b) {
    if (a.second == b.second) {
        return a.first < b.first;
    }
    return a.second > b.second;
}
int main() {
    int n, q;
    cin >> n >> q;
    for (int i = 1; i <= n; i++) {
        m[i] = 0;
    }
    int a, b, c, d;
    for (int i = 0; i < q; i++) {
        cin >> a >> b >> c >> d;
        if (c == d) {
            continue;
        }
       	map<int, int>::iterator ia = m.find(a);
       	map<int, int>::iterator ib = m.find(b);
        if (c > d) {
            ia->second += 3;
            ib->second -= 2;
            if (ib->second < 0) {
            	ib->second = 0;
            }
        } else {            
			ib->second += 3;
            ia->second -= 2;
            if (ia->second < 0) {
            	ia->second = 0;
            }
        }
    }
    vector<pair<int, int> > v(m.begin(), m.end());
    
    sort(v.begin(), v.end(), cmp);
    
    cout << v[0].first;
    
    
    return 0;
}

你可能感兴趣的:(极致通俗,算法)