蓝桥杯 交换次数【第九届】【决赛】【C组】

存限制:256.0MB C/C++时间限制:1.0s Java时间限制:3.0s Python时间限制:5.0s

  IT产业人才需求节节攀升。业内巨头百度、阿里巴巴、腾讯(简称BAT)在某海滩进行招聘活动。
  招聘部门一字排开。由于是自由抢占席位,三大公司的席位随机交错在一起,形如:
  ABABTATT,这使得应聘者十分别扭。
  于是,管理部门要求招聘方进行必要的交换位置,使得每个集团的席位都挨在一起。即最后形如:
  BBAAATTT 这样的形状,当然,也可能是:
  AAABBTTT 等。

  现在,假设每次只能交换2个席位,并且知道现在的席位分布,
  你的任务是计算:要使每个集团的招聘席位都挨在一起需要至少进行多少次交换动作。

  输入是一行n个字符(只含有字母B、A或T),表示现在的席位分布。
  输出是一个整数,表示至少交换次数。

  比如,输入:
  TABTABBTTTT

  程序应该输出:
  3

  再比如,输入:
  TTAAABB

 程序应该输出:
  0
 

只有三个字母一共六种排列方式,所以枚举每一种排列方式的最小操作方案取最min

#include <iostream>
#include <cstring>
#include <algorithm>
#include <set>
using namespace std;
typedef long long LL;
typedef pair<int,int>pii;
const int mod = 1e9 + 7 , INF = 0x3f3f3f3f , N = 1e6 + 10;


int cnt[4];
// cnt[0] : A 的个数  cnt[1] : B 的个数  cnt[2] : T 的个数 

int m[4][4]; 
// m[0][1] : 本应该是A 但却为B的个数  m[0][2] ... T的个数
// m[1][0] : 本应该是B 但却为A的个数  m[0][1] ... T的个数
// m[2][0] : 本应该是C 但却为A的个数  m[2][0] ... B的个数

int main()
{
    string s;
    cin >> s;
    for (int i = 0 ; s[i] ; i ++)
    {
        if (s[i] == 'A')
        {
            s[i] = '0';
            cnt[0] ++;
        }
        else if (s[i] == 'B')
        {
            s[i] = '1';
            cnt[1] ++;
        }
        else 
        {
            s[i] = '2';
            cnt[2] ++;
        }
    }
    
    string ss = "012";
    int res = INF;
    do{
        int b[4] = {0};
        memcpy(b,cnt,sizeof cnt);
        memset(m,0,sizeof m);
        int t = 0;
        int sum = 0;
        for (int i = 0 ; i < s.size() ; i ++)
        {
            if (s[i] != ss[t])
                m[ss[t] - '0'][s[i] - '0'] ++;
            if (-- b[ss[t] - '0'] == 0)
                t ++;
        }
        
        int t1 = min(m[0][1],m[1][0]);
        m[0][1] -= t1;
        m[1][0] -= t1;
        sum += t1;
        
        t1 = INF;
        t1 = min(m[0][2],m[2][0]);
        m[0][2] -= t1;
        m[2][0] -= t1;
        sum += t1;
        
        t1 = INF;
        t1 = min(m[1][2],m[2][1]);
        m[1][2] -= t1;
        m[2][1] -= t1;
        sum += t1;
        
        int ans = 0;
        for (int i = 0 ; i < 3 ; i ++)
        for (int j = 0 ; j < 3 ; j ++)
            ans += m[i][j];
        res = min(res,sum + ans / 3 * 2);
    }while(next_permutation(ss.begin(),ss.end()));
    
    cout << res;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值