Maestro de pesca HDUOJ 6709

Maestro de pesca HDUOJ 6709

Enlace de tema

Descripción del problema

Escuché que eom es un MAESTRO de pesca, quieres reconocerlo como tu mentor. Como todo el mundo sabe, si quieres ser aprendiz de MASTER debes pasar la prueba. Entonces, cuando encuentre Fishing MASTER eom, la prueba es la siguiente:

Hay n peces en la piscina. Para el i-ésimo pescado, se tarda al menos ti minutos en guisarlo (se puede cocinar demasiado). Para simplificar este problema, el tiempo dedicado a pescar un pez es de k minutos. Puede pescar uno a la vez y, como solo hay una olla, solo se puede guisar un pescado en la olla a la vez. Mientras está pescando un pez, no puede poner un pescado crudo que haya atrapado en la olla, eso significa que si comienza a pescar un pez, no puede parar hasta después de k minutos; cuando no está pescando, puede sacar un pescado cocido (guisado por no menos de ti) de la olla o poner un pescado crudo en la olla, estas dos operaciones no toman tiempo. Tenga en cuenta que si el pescado guisado en la olla no se guisa durante el tiempo suficiente, no puede sacarlo, pero puede ir a pescar otro pescado o simplemente esperar un rato sin hacer nada hasta que esté lo suficientemente guisado.

Ahora eom quiere que atrapes y cocines todo el pescado lo antes posible (definitivamente sabes que un pescado solo se puede comer después de estar lo suficientemente cocido), para que pueda tener una comida satisfactoria. Si puede completar eso en el menor tiempo posible, eom lo aceptará como su aprendiz y le dirá “¡Terminé! ¡Estoy lleno!". Si no puede, eom no lo aceptará y le dirá “¡Terminó! ¡Usted es tonto!".

Entonces, ¿cuál es el tiempo más corto para aprobar la prueba si lo organiza de manera óptima?

Entrada

La primera línea de entrada consta de un solo entero T (1≤T≤20), que denota el número de casos de prueba.

Para cada caso de prueba, la primera línea contiene dos números enteros n (1≤n≤1e5), k (1≤k≤1e9), que denotan el número de peces en el estanque y el tiempo necesario para capturar un pez.

la segunda línea contiene n números enteros, t1, t2,…, tn (1≤ti≤1e9), que denota el menor tiempo necesario para cocinar el i-ésimo pescado.

Salida

Para cada caso de prueba, imprima un solo entero en una línea, lo que indica el tiempo más corto para pasar la prueba.

Entrada de muestra

2
3 5
5 5 8
2 4
3 3

Salida de muestra

23
11

Pregunta de pensamiento ~
No podemos evitar el tiempo para cocinar el pescado primero, por lo que podemos calcular el número máximo de pescado capturado para el tiempo de cocción de cada pescado, de modo que podamos obtener el menor tiempo de captura de pescado primero, y luego podemos comenzar el tiempo de cocción del pescado desde Ordene de grande a pequeño. Si el pescado no se captura lo suficiente, continúe capturando el pescado. Si la captura es suficiente, simplemente agregue el tiempo de cocción restante. El código AC es el siguiente:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+5;
ll k,t[N];
int T,n;
int main(){
    
    
    scanf("%d",&T);
    while(T--){
    
    
        scanf("%d%lld",&n,&k);
        ll num=1,ans=k;
        for(int i=1;i<=n;i++){
    
    
            scanf("%lld",&t[i]);
            ll cnt=t[i]/k;
            if(cnt+num>=n){
    
    
                t[i]-=(n-num)*k;
                ans+=(n-num)*k;
                num=n;
            }else{
    
    
                t[i]%=k;
                ans+=cnt*k;
                num+=cnt;
            }
        }
        sort(t+1,t+1+n);
        reverse(t+1,t+1+n);
        for(int i=1;i<=n;i++){
    
    
            if(num<n){
    
    
                ans+=k;
                num++;
            }else{
    
    
                ans+=t[i];
            }
        }
        printf("%lld\n",ans);
    }
    return 0;
}

Supongo que te gusta

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