优惠买商品(dp、greedy)

https://codeforces.com/contest/1282/problem/B2

题意:给你n件商品,有p元,k优惠。有如下两种购买方式:

1、直接购买某商品花费该商品价格

2、买k个商品,只需支付k个中最贵的一个。

解法:排序,求前缀和,贪心尽可能的使用方式2.

//#include <bits/stdc++.h>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <iostream>
#include <cstdio>
#include <string>
#include <stdio.h>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <string.h>
#include <vector>
#define ME(x , y) memset(x , y , sizeof(x))
#define SF(n) scanf("%d" , &n)
#define rep(i , n) for(int i = 0 ; i < n ; i ++)
#define INF  0x3f3f3f3f
#define mod 1000000007
#define PI acos(-1)
using namespace std;
typedef long long ll ;
int a[200009];
int ans[200009];

int main()
{
    int t ;
    scanf("%d" , &t);
    while(t--)
    {
        int n , p , k ;
        scanf("%d%d%d" , &n , &p , &k);
        memset(ans , 0 , sizeof(ans));
        for(int i = 1 ; i <= n ; i++)
        {
            scanf("%d" , &a[i]);
        }
        sort(a + 1 , a + n + 1);
        int num = 0 ;
        for(int i = 1 ; i <= n ; i++) ans[i] = ans[i-1] + a[i];
        for(int i = k ; i <= n ; i++) ans[i] = ans[i - k] + a[i];
        for(int i = 1 ; i <= n ; i++)
        if(ans[i] <= p)
        num = i ;
        cout << num << endl ;
    }

    return 0 ;
}

 

posted @ 2020-01-29 00:47  无名菜鸟1  阅读(153)  评论(0编辑  收藏  举报