栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

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

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

蓝桥杯 交换次数【第九届】【决赛】【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 
#include 
#include 
#include 
using namespace std;
typedef long long LL;
typedef pairpii;
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;
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/873401.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号