/**
* poj2038 模拟 next_permutation
* 这个题感觉比较简单,用next_permutation就可以根据题面意思轻松完成任务了
* 先输入所有要比较的序列,然后用next_permutation一个一个计算120个序列和输入序列的差值
* 计算差值的方法也很土,字符的先后顺序一共只有4+3+2+1=10种,将两个输入序列的两字母间顺序都求出来,然后计算两个序列这10个字母对顺序不同的个数,就是diff了
*/
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int t;
char input[101][6];
int res[120];
char aidx[5],bidx[5];//下标代表字母(A-E),值为数字0-4,代表这个字母在指定序列中的序号
bool perma[10],permb[10];//AB AC AD AE BC ...一共10个顺序,正序为true,倒序为false
int diff(char* a,char* b){
int d=0,idx=0;
for(int i=0;i<5;++i){
aidx[a[i]-'A'] = i;
bidx[b[i]-'A'] = i;
}
for(int i=0;i<5;++i){
for(int j=i+1;j<5;++j){
perma[idx] = aidx[i] < aidx[j];
permb[idx] = bidx[i] < bidx[j];
d += (perma[idx]^permb[idx]) ? 1 : 0;
++idx;
}
}
return d;
}
int main(){
while(scanf("%d",&t)){
if(t==0){
break;
}
memset(res,0,sizeof(res));
for(int i=0;i<t;++i){
scanf("%s",input[i]);
}
char cpr[6]="ABCDE";
int min=1<<20;
char output[6],minidx;
for(int i=0;i<120;++i){
for(int j=0;j<t;++j){
res[i] += diff(input[j],cpr);
}
if(res[i] < min){
min = res[i];
minidx = i;
strcpy(output,cpr);
}
next_permutation(cpr,cpr+5);
}
output[5] = 0;
printf("%s is the median ranking with value %d.\n",output,res[minidx]);
}
return 0;
}
poj2038 模拟+next_permutation
最新推荐文章于 2015-10-06 15:31:15 发布