uva 140 Bandwidth 带宽

题目大意:

这道题很水的,纯暴力都可以过。有点难度也就是题意不好懂。。。

题目给你一个图,表示点和点之间的连接关系,然后让你找到这样的一个字符排序,使得带宽最小。带宽是这样定义的:在字符排序中,相连的点在字符串中的最大距离。这里相连的点就是题目输入的信息,距离指的是在字符串中的距离。

比如ABCFGDHE,题目中给出A和F相连,在这个字符串中的距离就是3,A和B相连,在字符串中的距离就是1。它的带宽为3。是最小的。


#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
#include<string>
#include<cstring>
#include<math.h>
#include<algorithm>
#include<assert.h>
#include<stdlib.h>
#include<stack>
#include<vector>
#include<map>
#include<set>
#define pi acos(-1.0)
#define ll long long
using namespace std;
struct node
{
    char s;
    char e;
};
node a [100];
int main()
{
   // freopen("in.txt","r",stdin);
   // freopen("out.txt","w",stdout);
    char tmp[500];
    char qi;
    int zimu[27]={0};
    while(scanf("%s",tmp)&&tmp[0]!='#')
    {
        int shu;
        memset(zimu,0,sizeof(zimu));
        int tt=0;
        qi=tmp[0];
        for(int i=1;i<strlen(tmp);i++)
        {
            if(tmp[i]==';')
            {
                qi=tmp[i+1];
                continue;
            }
            if(tmp[i]==':')
                continue;
            zimu[tmp[i]-'A'+1]=1;
            zimu[qi-'A'+1]=1;
            a[tt].s=qi;
            a[tt++].e=tmp[i];
        }
        shu=tt;
        char ch[30];
        tt=0;
        for(int i=1;i<=26;i++)
            if(zimu[i])
                ch[tt++]=char('A'-1+i);
        ch[tt]='\0';
        sort(ch,ch+tt);
        int ans=99999;
        int Max=0;
        int cixun=0;
        string res;
        do
        {
            Max=0;
            for(int i=0;i<shu;i++)
            {
                int temp=abs(strchr(ch,a[i].s)-strchr(ch,a[i].e));
                Max=max(Max,temp);
                if(Max>=ans)
                    break;
             }
             if(Max<ans)
             {
                 ans=Max;
                 res=ch;
             }
        }while(next_permutation(ch,ch+tt));
        cout<<res[0];
        for(int i=1;i<res.size();i++)
            cout<<" "<<res[i];
        printf(" -> %d\n",ans);
    }
    return 0;
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值