存限制: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;
}