Sicily 1006. Team Rankings

来源:互联网 发布:如何在淘宝卖充值卡 编辑:程序博客网 时间:2024/06/03 17:31
/*给定n个五元序列,找出离这五个序列的距离和最小的序列 注意:自定义的结构体在进行排序时,记得写cmp函数 注意:使用next_permutation()方法获取全排列,逐个逐个与输入的序列组合进行距离计算在单个距离计算时,分别将其ABCDE映射到两个map,比较任两个位置,如果大小关系不一致则说明距离+1 *//*Run Time: 0.02secsRun Memory: 312KB*/#include <iostream>#include <string>#include <algorithm>#include <vector>#include <map> using namespace std;typedef struct Pair{    int distance;    string ranking;}; int N;        //1-100string list[100];vector<Pair> results;int resultDis;int cmp(Pair a, Pair b){    return a.ranking < b.ranking;}int getDistance(string a){    int distance = 0;    string b;        map<char, int> A;    map<char, int> B;        for(int i=0; i<a.length(); i++)    //取得序列a的map         A[a[i]] = i;         for(int i=0; i<N; i++){        b = list[i];        int bufDis = 0;                for(int j=0; j<a.length(); j++)   //取得序列b的map             B[b[j]] = j;                     for(int j=0; j<5; j++){            for(int k=j+1; k<5; k++){                if( (A[a[j]]-A[a[k]]) * (B[a[j]]-B[a[k]]) < 0)    //在某两个位置上如果两个序列大小不一则说明位置反了                     bufDis++;            }        }                distance += bufDis;    }    return distance;}int main(){    while (cin>>N && N){        resultDis = -1;        if(results.size() != 0)            results.clear();        for(int i=0; i<N; i++)            cin >> list[i];                string ranking = "ABCDE";                do{            int bufDis = getDistance(ranking);    //计算该串的距离和                         if(resultDis==-1 || bufDis<=resultDis){                   if(bufDis<resultDis && results.size()!=0)   //如果碰到距离更小的,清空列表                     results.clear();                resultDis = bufDis;                 Pair buf;                buf.distance = bufDis;                buf.ranking = ranking;                results.push_back(buf);            }          }while(next_permutation(ranking.begin(), ranking.end()));                sort(results.begin(), results.end(), cmp);                cout << results[0].ranking << " is the median ranking with value " << results[0].distance << "." << endl;    }         return 0;}