HDUOJ 6438 Compra y reventa

HDUOJ 6438 Compra y reventa

Enlace de tema

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:

  1. gastar dólares de ia para comprar un Power Cube
  2. revender un Power Cube y obtener dólares de IA si tiene al menos un Power Cube
  3. 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 * k2Para 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;
}

Supongo que te gusta

Origin blog.csdn.net/qq_43765333/article/details/108671914
Recomendado
Clasificación