CF 1154F Shovels Shop

题目链接

我是题目链接戳我呀>_<

题面

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

题目大意

给出n件商品,m个优惠政策,计算购买k件商品最少花费多少。优惠政策为每买x件商品,最低的y件商品免费。优惠政策可搭配无限使用。

题目分析

购买k件商品,无论如何使用优惠政策 ,这k件商品一定是已知的n件商品中价格最低的k件商品。因此将商品价格排序,取价格最低的k件商品。由于优惠政策可随意使用,因此对这k件商品进行完全背包求解。求解价格时使用前缀和避免超时。最低价格即为优惠的商品价格最大时所需价格,最后用最低的k件商品价格总和减去最大优惠价格即为所求答案。(求和会报int。。。)

代码

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn=1e5;
int num[2*maxn+50],cnt[2*maxn+50],val[2*maxn+50];
ll dp[2010],sum[2010];
int main()
{
    int n,m,k;
    scanf("%d%d%d",&n,&m,&k);
    for(int i=1;i<=n;i++){
        scanf("%d",&num[i]);
    }
    for(int i=1;i<=m;i++){
        scanf("%d%d",&cnt[i],&val[i]);
    }
    sort(num+1,num+n+1);
    for(int i=1;i<=k;i++){
        sum[i]=sum[i-1]+num[i];
    }
    for(int i=1;i<=k;i++){
        for(int j=1;j<=m;j++){
            if(i>=cnt[j]){
                dp[i]=max(dp[i],dp[i-cnt[j]]+sum[i-cnt[j]+val[j]]-sum[i-cnt[j]]);
            }
        }
    }
    printf("%I64d\n",sum[k]-dp[k]);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_36711868/article/details/89415878