足球赛确定淘汰赛名单-map问题

科大讯飞笔试题:

题意

足球赛确定淘汰赛名单
比赛规则:
1、参赛队伍为n支, n为偶数。
2、入围淘汰赛队伍为n/2支。
3、按积分排名,胜一场积3分,平一场积1分, 负一场积0分,积分相同按净胜球排名,净胜球相同按进球数排名。

输入输出

第一行为一个整数n,参赛队伍数
随后n行为球队名字
随后n*(n-1)/2行为赛事开展情况,格式为 name1-name2 num1:num2

输出n/2行,按字母排序的进入淘汰赛名单

示例

输入

4
A
B
C
D
A-B 1:1
A-C 2:2
A-D 1:0
B-C 1:0
B-D 0:3
C-D 0:3

输出

A
D

程序如下

暂时未考虑积分相同情况,可再定义两个容器,分别用于记录净胜球数及进球数。

#include
#include
#include 
#include 
using namespace std;
vector<string> ans;

int main() {
    int n,i, j,len, n1, n2, n3, nu1, nu2;
    string str, temp, na, nb, num1, num2;

    vector<int> vec;
    map<string, int> mymap;
    map<string, int>::iterator it;

    char ch;
    while(cin >> n){
        vec.clear();
        mymap.clear();

        for(i = 0; i < n; i++){
            cin >> temp;
            mymap.insert(pair<string, int>(temp, 0));
        }
        ch = cin.get();

        for(i = 0; i < n*(n-1)/2; i++){
            temp = "";          
            while(ch = cin.get()){
                if(ch == '\n')
                    break;
                temp += ch;
            }

            len = temp.length();                            //开始记录比赛情况
            for(j = 0; j< len; j++){
                if(temp[j] == '-'){
                    n1 = j;
                    na = temp.substr(0, j);                  //比赛的第一支队伍
                }
                if(temp[j] == ' '){
                    n2 = j;
                    nb = temp.substr(n1+1, n2-n1-1);         //比赛的第二支队伍
                }
                if(temp[j] == ':'){
                    n3 = j;
                    num1 = temp.substr(n2+1, n3-n2-1);       //第一支队伍的进球数
                }

            }
            num2 = temp.substr(n3+1, len-n3-1);              //第二支队伍的进球数

            nu1 = nu2 = 0;
            for(j = 0; j < num1.length(); j++){
                nu1 = nu1*10+(num1[j]-'0');
            }
            for(j = 0; j < num2.length(); j++){
                nu2 = nu2*10+(num2[j]-'0');
            }

            if(nu1>nu2){
                it = mymap.find(na);                        //胜一场积3分
                it->second += 3;                
            }else if(nu1 == nu2){
                it = mymap.find(nb);              
                it->second += 1;                             //平一场积1分
                it = mymap.find(na);
                it->second += 1;
            }else{
                it = mymap.find(nb);
                it->second += 3;
            }
        }
        for(it = mymap.begin(); it!= mymap.end(); it++){       //积分排序
            vec.push_back(it->second);
        }
        sort(vec.begin(), vec.end());
        for(it = mymap.begin(); it!= mymap.end(); it++){
            if(it->second>vec[n/2-1]){
                ans.push_back(it->first);                      //输出积分高的一半队伍
            }
        }
    }
    for(i = 0; i < ans.size(); i++){
        cout << ans[i] <<"\n";
    }

    return 0;
}

你可能感兴趣的:(c++,算法)