HDUOJ 6438 Compra y reventa
Descripción del problema
El Power Cube se usa como un alijo de poder exótico. Hay n ciudades numeradas 1,2,…, n donde se permite comerciar con él. El precio de negociación del Power Cube en la i-ésima ciudad es de dólares por cubo. Noswal es un hombre de negocios astuto y quiere hacer una fortuna en silencio comprando y revendiendo Power Cubes. Para evitar ser descubierto por la policía, Noswal irá a la i-ésima ciudad y elegirá exactamente una de las siguientes tres opciones el i-ésimo día:
- gastar dólares de ia para comprar un Power Cube
- revender un Power Cube y obtener dólares de IA si tiene al menos un Power Cube
- hacer nada
Obviamente, Noswal puede poseer más de un Power Cubes al mismo tiempo. Después de ir a las n ciudades, regresará a casa y se mantendrá alejado de la policía. Quiere saber el beneficio máximo que puede obtener. Mientras tanto, para reducir los riesgos, quiere minimizar los tiempos de negociación (incluye compra y venta) para obtener el máximo beneficio. Noswal es un hombre de negocios astuto y exitoso, por lo que puede suponer que tiene dinero infinito al principio.
Entrada
Hay varios casos de prueba. La primera línea de entrada contiene un número entero positivo T (T≤250), que indica el número de casos de prueba. Para cada caso de prueba:
la primera línea tiene un número entero n. (1≤n≤1e5)
La segunda línea tiene n números enteros a1, a2,…, donde ai significa el precio de negociación (compra o venta) del Power Cube en la i-ésima ciudad. (1≤ai≤1e9)
Se garantiza que la suma de todos los n no es superior a 5e5.
Salida
Para cada caso, imprima una línea con dos números enteros: el beneficio máximo y los tiempos mínimos de negociación para obtener el beneficio máximo.
Entrada de muestra
3
4
1 2 10 9
5
9 5 9 10 5
2
2 1
Salida de muestra
16 4
5 2
0 0
Thinking + Priority Queue ~ En
términos simples, no es difícil encontrar que es 2 ∗ k 2 * k2∗Para el grupo k , la respuesta es:
ak + 1 + ak + 2 +… + a 2 k - (a 1 + a 2 +… + ak) a_ {k + 1} + a_ {k + 2} + \ cdots + a_ { 2k} - (a_1 + a_2 + \ cdots + a_k)unak + 1+unak + 2+⋯+una2 K-( un1+una2+⋯+unak)
Pero esto es realmente difícil de pensar. Si ajustamos esta fórmula, obtendremos:
a 2 - a 1 + a 3 - a 2 + a 4 - a 2 + a 4 - a 3 +… = a 2 k - a 2 k - 1 a_2-a_1 + a_3-a_2 + a_4-a_2 + a_4-a_3 + \ cdots = a_ {2k} -a_ {2k-1}una2-una1+una3-una2+una4-una2+una4-una3+⋯=una2 K-una2 K - 1
La fórmula anterior es fácil de usar para lograr una cola de prioridad, es decir, cuando el elemento es más grande que el encabezado de la cola, se insertará una vez más. Cuando un elemento de la cola está vacío, el número de veces se incrementará en 2 22 OK, el código de CA es el siguiente:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
map<ll,ll>mp;
priority_queue<ll,vector<ll>,greater<ll>>q;
int t,n;
int main(){
scanf("%d",&t);
while(t--){
mp.clear();
ll ans=0,x;
int num=0;
while(!q.empty()) q.pop();
scanf("%d",&n);
while(n--){
scanf("%lld",&x);
if(!q.empty()&&x>q.top()){
if(mp[q.top()]) mp[q.top()]--;
else num+=2;
mp[x]++;
ans+=x-q.top();
q.pop();
q.push(x);
}
q.push(x);
}
printf("%lld %d\n",ans,num);
}
return 0;
}