Sicily 1006 Team Rankings

题意记不大清楚了,很久之前做的。只大概记得是用全排列搜索将所有的排列组合打表写在一个二维数组里,然后再根据题目要求找出最佳的一种组合。

#include <stdio.h>
#include <string.h>
char per[130][8];
int n=0;
const int size = 5;
// 全排列函数,可以直接使用STL中的next_permutation代替,所有组合情况写在数组per中
void perm(int* num, int i) {
    int j, k, tmp;
    if(i < size) {
        for(j = i; j < size; j++) {
            tmp = num[j];
            for(k = j; k > i; k--)
                num[k] = num[k-1];
            num[i] = tmp;
            perm(num, i+1);
            for(k = i; k < j; k++)
                num[k] = num[k+1];
            num[j] = tmp;
        }
    }
    else { 
        for(j = 0; j < size; j++)
            per[n][j]=num[j]+'A';
        per[n][j]='\0';
        n++;
    }
}
int search( char a, char *s ) {
    int i;
    for ( i=0;i<size;i++ ) {
        if ( s[i]==a )
            break;      
    }
    return i;
}
int main()
{
    int i,t,j,l,k;
    char data[140][8];
    int sum[140];
    int num[5]={0,1,2,3,4};
    int min1,ch1,ch2;
    char temp[8];

    perm(num,0);
   /* for ( i=0;i<n;i++ ) {
        for ( j=0;j<n;j++ ) {
            if ( strcmp(per[i],per[j])<0 ) {
                strcpy(temp,per[i]);
                strcpy(per[i],per[j]);
                strcpy(per[j],temp);
            } 

        }
    }*/

    scanf( "%d",&t );
    while ( t!=0 ) {
        for ( i=0;i<t;i++ )
            scanf( "%s",&data[i] );
        if ( t==1 ) {
            printf( "%s is the median ranking with value 0.\n", data[0] );
        }
        else {
        for ( i=0;i<n;i++ ) {
            sum[i]=0;
            for ( k=0;k<t;k++ ) {
                for ( j=0;j<size;j++ ) {
                    ch1=search(data[k][j], per[i] );
                    for ( l=j+1;l<size;l++ ) {
                        ch2=search(data[k][l],per[i] );      
                        if ( ch1>ch2 )
                            sum[i]++;
                    }

                }
            }
        }
        min1=sum[0];
        for ( i=0;i<n;i++ ) { 
            if ( sum[i]<min1 )
                min1=sum[i];
        }
        for ( i=0;i<n;i++ ) {
            if ( sum[i]==min1 ) { 
                printf( "%s is the median ranking with value %d.\n", per[i], sum[i] );
                break;
            }
        }
        }
        scanf( "%d",&t );
    }   
    return 0;
}
                                


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值