Sicily.1006. Team Rankings

来源:互联网 发布:淘宝找别人代付 编辑:程序博客网 时间:2024/06/07 06:50
/*1006. Team Rankings
题目大意:给出n串由A B C D E组成的任意字符序列,求出与这n串序列之间的差值最小的序列,并输出其差值.求两串字符的差值规则:如 ABDCE, BACDE, ABCED and ACBDE, 则ABCDE与他们的差值和为1 + 1 + 1 + 1 = 4. 因为如 ABDCE 和 ABCDE中两个字符串的相对位置不同的对数只有一对,即DC 和CD  依次类推。。。解题方法1: 利用N皇后的方法,让他们各种可能的序列。然后用该生成的序列candidate与给出的n组序列ranking[i],分别求出差值并求和。  这里求差值的方法:使用map<char, int> ,先把candidate中各个字符(key)与其所处的下标(value)映射起来。即如ABCDE对应的map为{ (A,0), (B,1), (C,2), (D, 3), (E, 4)} 然后在遍历ranking[i]时, 如 ABDCE ,先从取第一位如A,然后与后面的B、C、D、E在上述map中的相对位置比较  如果出现 map[charA] > map[charLast],即出现相对位置与map上的不用的,差值+1 解题方法2: 可以直接使用系统提供的函数求全排列,next_permutation(str.begin(), str.begin()+偏移量) ,其生成的全排列就放在str中调用如下do {    }while(next_permutation(str.begin(), str.begin()+偏移量)); //生成字符串//ABCDE的所有排列,但是要求原始的字符串是从小到大排列开始,生成成功就返回true    */#include <iostream>#include <stdlib.h>#include <stack>#include <algorithm>#include <map>using namespace std;map<char, int> m;int getDistance(string b){   int distance = 0;   for(int i=0; i<4; i++)   for(int j=i+1; j<5; j++)   if(m[b[i]] > m[b[j]])   distance++;   return distance;}int main(){    int n=-1;    int sum;    string ranking[100];    while(cin >> n && n != 0)    {        for(int i=0; i<n; i++)           cin >> ranking[i];        //a[i]的值为列数,i为行数                 int min = 99999;        string final;        string initStr = "ABCDE";        do        {                      for(int i=0; i<initStr.length(); i++)              m[initStr[i]] = i;           sum =0;           for(int i=0; i<n; i++){              sum +=  getDistance(ranking[i]);               }                         if(sum < min)           {              min = sum;              final = initStr;                  }        }while(next_permutation(initStr.begin(), initStr.begin()+5));                cout << final << " is the median ranking with value " << min << "."<< endl;                        }        system("pause");return 0;}


原创粉丝点击