蓝桥杯2018年真题-交换次数

文章介绍了一个编程问题,涉及字符串处理和算法设计。给定一个包含B,A,T字符的字符串,代表BAT公司在海滩上的招聘摊位分布,需要通过最少的两次交换操作将同公司摊位集中。提供的暴力解法是遍历所有可能的排列组合,计算交换次数,然后找出最小值。代码示例中使用了0x3f3f3f3f作为无穷大初始值来存储最小交换次数。
摘要由CSDN通过智能技术生成

知识点:无穷大的定义0x3f3f3f3f

0x3f3f3f3f是什么意思???

为什么无穷大总是0x3f3f3f3f而不是0x7fffffff?

题目:

IT产业人才需求节节攀升。业内巨头百度、阿里巴巴、腾讯(简称BAT)在某海滩进行招聘活动。

招聘部门一字排开。由于是自由抢占席位,三大公司的席位随机交错在一起,形如:

ABABTATT,这使得应聘者十分别扭。

于是,管理部门要求招聘方进行必要的交换位置,使得每个集团的席位都挨在一起。即最后形如:

BBAAATTT 这样的形状,当然,也可能是:

AAABBTTT 等。

现在,假设每次只能交换2个席位,并且知道现在的席位分布,

你的任务是计算:要使每个集团的招聘席位都挨在一起需要至少进行多少次交换动作。

输入:

输入是一行n个字符(只含有字母B、A或T),表示现在的席位分布。

n<=104

输出:

输出是一个整数,表示至少交换次数。

思路:

暴力:6种排列方式

宏观可分为3个区A\B\C

交换次数=A区非A个数+B区C的个数+B区A的个数-min(A区B的个数,B区A的个数)

然后比较6种排列中,交换次数最小的是几次

代码:

#include<iostream>
#include<algorithm>
#include<queue>
using namespace std;
string str;
int mn = 0x3f3f3f3f;//定义一个无穷大
char t[6][4] = { "ABT", "ATB", "BAT","BTA","TAB","TBA"};
int changes(char A, char B, char C) {
    int a=0, b=0, c=0,num=0,numb=0,numa=0,numc=0;
    for (int i = 0; i < str.length(); i++) {
        if (str[i] == A)
            a++;
        else if (str[i] == B)
            b++;
        else if (str[i] == C)
            c++;
    }
    for (int i = 0; i < a; i++) {
        if (str[i] != A)
            num++;
        if (str[i] == B)
            numb++;
    }
    for (int i = a; i < a + b; i++) {
        if (str[i] == A)
            numa++;
        if (str[i] == C)
            numc++;
    }
    num += numa + numc - min(numa,numb);
    return num;
}

int main() {
    cin >> str;
    for (int i = 0; i < 6; i++) {
        mn = min(mn, changes(t[i][0], t[i][1], t[i][2]));
    }
    cout << mn << endl;
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值