zoj2038 //distance的函数写的很精…

基于字典序列与距离计算的算法优化
#include<iostream>
#include<string>
#include<cstdlib>
#include<algorithm>
using namespace std;
const int INF=1000000000;
string sa[125];
string sb[105];
int lena;
void Init()
{
     string ss="ABCDE";
     sa[lena++]=ss;//ss等效sort初始化字典序列 
     while(next_permutation(ss.begin(),ss.end()))
        sa[lena++]=ss;
}

int Distance(string s1,string s2)    // 逆序数
{
    int i,j,k,t,num=0;
    for(i=0;i<s1.size();i++)
    {
       for(j=0;j<s2.size();j++)
         if(s1[i]==s2[j])
           break;
       for(k=i+1;k<s1.size();k++)
         for(t=j-1;t>=0;t--)
          if(s1[k]==s2[t])
            num++;
    }
    return num;
}
int main()
{
    int i,j,n,sum,ans,temp;
    string ss;
    lena=0;
    
    Init();//初始化 
    
    while(cin>>n,n)
    {
       for(i=0;i<n;i++)
         cin>>sb[i];
       ans=INF;
       for(i=0;i<lena;i++)
       {
          sum=0;
          for(j=0;j<n;j++)
          {
              temp=Distance(sa[i],sb[j]);
              sum+=temp;
          }
          if(ans>sum)
          {
              ans=sum;
              ss=sa[i];
          }
       }
       cout<<ss<<" is the median ranking with value "<<ans<<"."<<endl;
    }
    system("pause");
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值