Codeforces Ronda # 610 (Div.2) B

Pregunta: Quieres comprar regalos para tus amigos. Ahora tienes dos métodos de compra
. El primero es comprar un artículo al precio de una [i].
El segundo es elegir k artículos y gastar estos k El precio máximo de los artículos para obtener estos k artículos.
Ahora tiene la cantidad de dinero p. Pregunte cuántos regalos puede comprar como máximo.
Si desea obtener más regalos con menos dinero, definitivamente usaré mi derecho Para obtener k artículos,
ordene la
matriz de precios de artículos dp [i] para registrar el costo de comprar i artículos
sin usar el derecho a comprar
dp [i] = dp [i-1] + a [i];
use el derecho k Empaqueta
dp [i] = dp [ik] + a [i];
se obtiene la ecuación de transición de estado:
dp [i] = min (dp [i-1] + a [i], dp [ik] + a [i] );
Luego, después de atravesar, averigüe cuál es la i más grande que se puede comprar con p dinero y la producción i

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>

using namespace std;
typedef long long ll;
const int MAXN = 2e5+7;
int a[MAXN],dp[MAXN];
int main()
{
    
    
    int t;
    cin>>t;
    while(t--)
    {
    
    
        int n,p,k;
        scanf("%d%d%d",&n,&p,&k);
        for(int i = 1;i <= n;i ++){
    
    
            scanf("%d",&a[i]);
        }
        sort(a+1,a+1+n);
        for(int i = 1;i <= n;i ++)
        {
    
    
            dp[i] = dp[i-1]+a[i];
            if(i >= k)
            {
    
    
                dp[i] = min(dp[i],dp[i-k]+a[i]);
            }
        }
        int ans = 0;
        for(int i = 1;i <= n;i ++)
        {
    
    
            if(p >= dp[i])
            {
    
    
                ans = max(ans,i);
            }
        }
        printf("%d\n",ans);
    }
    return 0;
}

Supongo que te gusta

Origin blog.csdn.net/weixin_45672411/article/details/104813730
Recomendado
Clasificación