Cómo organizar la competencia en la final de la 16 ° Competencia de Programación de la Universidad Normal de Beijing (53082)
Titulo
http://www.bnuoj.com/problem_show.php?pid=53082
Titulo
Es la competencia anual de programación nuevamente ~
Ahora los concursantes hacen una larga fila frente a la sala de computación, hay chicos lindos y grandes en esta sala, y todos los chicos lindos admiran a los grandes. Esperamos el maravilloso nivel de este juego. Para cada Mengxin, su expectativa para este partido es el número de grandes jugadores frente a él / ella, y la expectativa total de este partido es igual a cada Mengxin La suma de las expectativas.
Como organizador de esta competencia, los estudiantes de SK esperan que la expectativa de la competencia sea la correcta. Si es demasiado baja, hará que todos estén menos interesados, y si es demasiado alta, se rociará y no cumplirá con las expectativas.
Ahora los estudiantes de SK pueden intercambiar dos competidores adyacentes, pero el juego está por comenzar. Los estudiantes de SK quieren saber cuántos intercambios son necesarios para hacer que la expectativa total de este juego sea solo k, ¿pueden ayudarlo? Es?
Solución
Al observar, podemos encontrar que cada vez que intercambiamos las posiciones del nuevo y el hermano mayor, la satisfacción cambiará1. Entonces registramos la satisfacción actual y luego hacemos una diferencia con el valor k. También preste atención a juzgar el valor máximo, que debería ser el número de gángsters multiplicado por el número de recién llegados.
Código
#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;
}