Forças de código Rodada # 610 (Div. 2) B

Pergunta: Você quer comprar presentes para seus amigos. Agora você tem dois métodos de compra
. O primeiro é comprar um item pelo preço de a [i].
O segundo é escolher k itens e gastar este k O preço máximo dos itens para obter esses k itens.
Agora você tem a quantia de dinheiro p. Pergunte quantos presentes você pode comprar no máximo.
Se você quiser receber mais presentes com menos dinheiro, então com certeza usarei meu direito Para obter k itens,
solicite a
matriz de preços de itens dp [i] para registrar o custo de compra de i itens
sem usar o direito de comprar
dp [i] = dp [i-1] + a [i];
use o k certo Empacotar juntos
dp [i] = dp [ik] + a [i]; a
equação de transição de estado é obtida:
dp [i] = min (dp [i-1] + a [i], dp [ik] + a [i] );
Depois de percorrer, descubra qual é o maior i que pode ser comprado por p dinheiro e pela produção 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;
}

Acho que você gosta

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