zoukankan      html  css  js  c++  java
  • 1006. Team Rankings

    Description
    It's preseason and the local newspaper wants to publish a preseason ranking of the teams in the local amateur basketball league. The teams are the Ants, the Buckets, the Cats, the Dribblers, and the Elephants. When Scoop McGee, sports editor of the paper, gets the rankings from the selected local experts down at the hardware store, he's dismayed to find that there doesn't appear to be total agreement and so he's wondering what ranking to publish that would most accurately reflect the rankings he got from the experts. He’s found that finding the median ranking from among all possible rankings is one way to go. 

    The median ranking is computed as follows: Given any two rankings, for instance ACDBE and ABCDE, the distance between the two rankings is defined as the total number of pairs of teams that are given different relative orderings. In our example, the pair B, C is given a different ordering by the two rankings. (The first ranking has C above B while the second ranking has the opposite.) The only other pair that the two rankings disagree on is B, D; thus, the distance between these two rankings is 2. The median ranking of a set of rankings is that ranking whose sum of distances to all the given rankings is minimal. (Note we could have more than one median ranking.) The median ranking may or may not be one of the given rankings. 

    Suppose there are 4 voters that have given the rankings: ABDCE, BACDE, ABCED and ACBDE. Consider two candidate median rankings ABCDE and CDEAB. The sum of distances from the ranking ABCDE to the four voted rankings is 1 + 1 + 1 + 1 = 4. We'll call this sum the value of the ranking ABCDE. The value of the ranking CDEAB is 7 + 7 + 7 + 5 = 26. 

    It turns out that ABCDE is in fact the median ranking with a value of 4. 
    Input
    There will be multiple input sets. Input for each set is a positive integer n on a line by itself, followed by n lines (n no more than 100), each containing a permutation of the letters A, B, C, D and E, left-justified with no spaces. The final input set is followed by a line containing a 0, indicating end of input.
    Output
    Output for each input set should be one line of the form: 

    ranking is the median ranking with value value. 

    Of course ranking should be replaced by the correct ranking and value with the correct value. If there is more than one median ranking, you should output the one which comes first alphabetically. 
    Sample Input
     Copy sample input to clipboard 
    4
    ABDCE
    BACDE
    ABCED
    ACBDE
    0
    Sample Output
    ABCDE is the median ranking with value 4.

    主要是注意输出的后面还有一个点。。

    #include <iostream>
    #include <algorithm>
    #include <string>
    #include <vector>
    #include <map>
    
    using namespace std;
    
    int cmpInt(map<char, int> &rank, const string &str) {
        map<char, int> tmpRank;
        int sum = 0;
        for (int i = 0; i != 5; ++i) {
            tmpRank.insert(pair<char, int>(str[i], i));
        }
        for (int i = 0; i != 5; ++i) {
            for (int j = i + 1; j < 5; ++j) {
                int a = tmpRank['A' + i] - tmpRank['A' + j];
                int b = rank['A' + i] - rank['A' + j];
                if (a * b < 0) {
                    ++sum;
                }
            }
        }
        return sum;
    }
    
    int main(int argc, char *argv[])
    {
        int T;
        string str("ABCDE");
        string temp;
        string result;
        while (cin >> T && T != 0) {
            vector<map<char, int> > data;
            for (int i = 0; i != T; ++i) {
                cin >> temp;
                map<char, int> tmpRank;
                for (int i = 0; i != 5; ++i) {
                    tmpRank.insert(pair<char, int>(temp[i], i));
                }
                data.push_back(tmpRank);
            }
            int minR = 0;
            bool f = true;
            do {
                int sum = 0;
                for (vector<map<char, int> >::iterator iter = data.begin();
                    iter != data.end(); ++iter) {
                    sum += cmpInt(*iter, str);
                }
                if ((minR == 0 && f) || minR > sum){
                        f = false;
                        minR = sum;
                        result = str;
                }
            } while (next_permutation(str.begin(), str.end()));
            cout << result << " is the median ranking with value " << minR << "."<< endl;
        }
    }
  • 相关阅读:
    Windows编程中UNICODE和_UNICODE定义问题
    关于暗时间
    一种简单的图像显著性计算模型
    L2TP连接尝试失败,因为安全层在初始化与远程计算机的协商时遇到了一个处理错误
    L2TP连接尝试失败,因为安全层在初始化与远程计算机的协商时遇到了一个处理错误
    Python正则表达式指南
    【Python】解压文件/ZIP等 并实时计算解压进度
    使用html2canvas和jsPdf实现打印功能
    Windows Phone 7 开发资源汇总
    批量删除数据库中有特定开始字符的表、视图和存储过程
  • 原文地址:https://www.cnblogs.com/xiezhw3/p/4007181.html
Copyright © 2011-2022 走看看