第十六届北京师范大学程序设计竞赛决赛 (53082)如何办好比赛
题目
http://www.bnuoj.com/problem_show.php?pid=53082
题意
又到了一年一度的程序设计大赛了~
现在参赛选手在机房前排起了一列长队,这里面有萌新也有大佬,萌新都很仰慕大佬,由于大佬们的参赛,萌新们对这次比赛的精彩程度格外期待。对于每个萌新来说,他/她/它对本次的比赛的期待度为排在他/她/它前面的大佬的数量,而这次比赛的总期待度等于每个萌新的期待度之和。
SK同学作为本次比赛的组织者,希望比赛的期待度能够刚刚好,太低的话会让大家兴致不高,太高的话会被喷不满足预期。
现在SK同学可以交换任意相邻的两名参赛选手,但是比赛马上就要开始了,SK同学想知道最少要进行多少次交换才能使得这次比赛的总期待度刚好为k,你能帮帮他吗?
题解
通过观察我们可以发现每次互换萌新和大佬的位置,满意度就会改变1。所以我们记录当前的满意度,然后在和k值做差就可以了。还要注意判断最大值,最大值应该是大佬人数乘以萌新人数。
代码
#include<iostream>
#include<algorithm>
#include<vector>
#include<queue>
#include<stack>
#include<string.h>
#include<stdio.h>
using namespace std;
#define mem(a,b) memset(a,b,sizeof(a))
#define ll long long
const int maxn = 100005;
int main()
{
int T;
char s[1000006];
char ans[1000006];
scanf("%d",&T);
while(T--)
{
ll n,d=0,m=0;
ll sum = 0,ret = 0,k;
scanf("%lld %lld",&n,&k);
getchar();
for(int i=0;i<n;i++)
{
scanf("%c",&s[i]);
if(s[i] == 'D')
d++;
else
{
m++;
ret += d;
}
}
sum = d*m;
if(k>sum)
puts("-1");
else
printf("%lld\n",abs(k-ret));
}
return 0;
}