2038 Team Rankings
問題概要
5チームのランキングがいくつか与えられる。
これらに対してmedian rankingを次のように定める。
median rankingと、それぞれのランキングについて任意の二つのチームの上下関係が逆転しているたびに値に1を足す。
この値が最小になるようなランキングがmedian rankingである。
与えられたランキングに対してmedian rankingを求めよ。
解法
チーム数は5,ランキングの数は100以下と少ないので全探索すればよい。
ソースコード
int n,tmp[5],ans[5]; int in[100][5]; char s[9]; int main() { while(scanf("%d",&n),n) { rep(i,n) { scanf("%s",s); rep(j,5)in[i][s[j]-'A']=j; } int mn=inf; rep(i,5)tmp[i]=i; do { int cnt=0; rep(i,n)rep(j,5)rep(k,j) if((tmp[j]<tmp[k])!=(in[i][j]<in[i][k]))cnt++; if(mn>cnt) { mn=cnt; rep(i,5)ans[i]=tmp[i]; } }while(next_permutation(tmp,tmp+5)); rep(i,5)s[ans[i]]='A'+i; printf("%s is the median ranking with value %d.\n",s,mn); } return 0; }