第十六届北京师范大学程序设计竞赛决赛 I. 如何办好比赛 类似逆序数思想

又到了一年一度的程序设计大赛了~

 

现在参赛选手在机房前排起了一列长队,这里面有萌新也有大佬,萌新都很仰慕大佬,由于大佬们的参赛,萌新们对这次比赛的精彩程度格外期待。对于每个萌新来说,他/她/它对本次的比赛的期待度为排在他/她/它前面的大佬的数量,而这次比赛的总期待度等于每个萌新的期待度之和。

 

SK同学作为本次比赛的组织者,希望比赛的期待度能够刚刚好,太低的话会让大家兴致不高,太高的话会被喷不满足预期。

 

现在SK同学可以交换任意相邻的两名参赛选手,但是比赛马上就要开始了,SK同学想知道最少要进行多少次交换才能使得这次比赛的总期待度刚好为,你能帮帮他吗?

Input

第一行是一个正整数,表示测试数据的组数,

对于每组测试数据,

第一行是两个正整数和,分别表示队列长度和最终的比赛总期待度,

接下来一行包含个字符,表示这个队列,第个字符表示队列里的第个人,'D'表示大佬,'M'表示萌新,保证不会出现其它字符。

Output

对于每组测试数据,输出一行,包含一个整数,表示最少的交换次数,无解输出-1。

Sample Input

2
3 1
DMM
3 3
DMM

Sample Output

1
-1

思路:比赛的时候看到数据范围,感觉是个dp,然后放弃,后来队友说就是一个公式题目,尴尬。。。

左右移动D,只会有3种结果+1 -1 0,所以先判断当前的数据最大的期望值是否符合输入,不符合则为-1,符合则计算当前的值-期望值的绝对值

 

#include
using namespace std;
typedef long long ll;
const int INF = 0x3f3f3f3f;
const int N =1e6+5;
char s[N];

int main()
{
	int t;
	cin>>t;
	while(t--){
        ll n,k;
        cin>>n>>k;
        cin>>s;
        ll cntm=0,cntd=0,ans=0;
        for(int i=0;icntd*cntm) printf("-1\n");
        else printf("%lld\n",abs(ans-k));
	}
	return 0;
}









 

你可能感兴趣的:(ACM_数字处理与数论,ACM_树状数组)