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;}