题意
给出一个字符串,全由D和M组成,D代表大佬,M代表萌新,每个萌新前面的大佬数量之和是该队列的期望值,你可以将任意将相邻的人进行交换,现在给出一个k,问最少需要几次交换可以把队列的期望值变成k,无法做到输出-1;
思路
其实很简单,因为相邻的两个人交换最多让队列的期望值加一或者减一,所以只要先算出一开始的队列期望值,再和k作差即可;不存在的情况就是大佬数乘于萌新数就是队列可以达到的最大期望值,与k比大小即可;(比赛时傻逼了,没看到相邻,自闭了)
代码
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
char s[1000100];
int main(){
int t;
scanf("%d", &t);
while(t--){
ll n, k;
scanf("%lld%lld", &n, &k);
scanf("%s", &s);
ll sum = 0, cnt = 0, now = 0;
for(int i = n - 1; i >= 0; i--){
if(s[i] == 'M'){
sum++;
}
else{
now += sum;
cnt++;
}
}
if(k > cnt * (n - cnt)){
printf("-1\n");
continue;
}
printf("%lld\n", abs(now - k));
}
}