题目链接:https://codeforces.com/contest/1154/problem/F

题解:

首先,可以确定的是:

  1、$(x,y)$ 里 $x>k$ 的都不可能用;

  2、肯定买的是 $n$ 个铲子里,价格前 $k$ 小的铲子。

然后,我们用 $f[i]$ 表示买前 $i$ 个铲子,最多可以优惠掉多少钱。

我们假设 $g[x]$ 代表买 $x$ 个铲子,最多可以不用付 $g[x]$ 个铲子的钱。得到状态转移方程:

$f[i] = \min_{j=0}^{i-1}(f[j]+\sum_{k=j+1}^{j+g[i-j]} a[k] )$

换句话说,对于 $f[i]$,我们遍历所有的 $j \in [0,i)$:

  此时,我们前 $j$ 个铲子,最多优惠掉了 $f[j]$ 的钱,那么 $(j+1) \sim i$ 这 $i-j$ 个铲子,我们直接用 $g[i-j]$ 的优惠,省掉这 $i-j$ 个铲子里最便宜的 $g[i-j]$ 个铲子的钱。这样,我们就得到了一种买前 $i$ 个铲子的方案。(至于怎么求 $f[i]$,即维护所有 $j$ 对应的方案中,省钱最多的那一个方案即可。)

  那为什么不用 $g[i-j-1],g[i-j-2],\cdots$ 这些优惠呢?因为假设用这些优惠能省钱更多,那么由于 $f[i]$ 是递增的,所以“$f[j+1]$ 加上用 $g[i-(j+1)]$ 的省钱量”,肯定优于,“$f[j]$ 加上用 $g[i-j]$ 的省钱量”。而“$f[j+1]$ 加上用 $g[i-(j+1)]$ 的省钱量”会在下一个 $j$ 被算到,所以不影响正确性。

AC代码:

#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int> P;
const int maxn=2e5+;
const int maxk=2e3+; int n,m,k;
int a[maxn],s[maxn];
int g[maxk];
int f[maxk]; int main()
{
cin>>n>>m>>k;
for(int i=;i<=n;i++) scanf("%d",&a[i]);
for(int i=,x,y;i<=m;i++)
{
scanf("%d%d",&x,&y);
if(x<=k) g[x]=max(g[x],y);
}
sort(a+,a+n+);
for(int i=;i<=k;i++) s[i]=s[i-]+a[i];
for(int i=;i<=k;i++)
{
f[i]=;
for(int j=;j<i;j++)
f[i]=max(f[i],f[j]+s[j+g[i-j]]-s[j]);
}
cout<<s[k]-f[k]<<endl;
}

Codeforces 1154F - Shovels Shop - [DP]的更多相关文章

  1. codeforces#1154F. Shovels Shop (dp)

    题目链接: http://codeforces.com/contest/1154/problem/F 题意: 有$n$个物品,$m$条优惠 每个优惠的格式是,买$x_i$个物品,最便宜的$y_i$个物 ...

  2. Codeforces 1154F Shovels Shop

    题目链接:http://codeforces.com/problemset/problem/1154/F 题目大意: 商店有n把铲子,欲购k把,现有m种优惠,每种优惠可使用多次,每种优惠(x, y)表 ...

  3. CF F. Shovels Shop(前缀和预处理+贪心+dp)

    F. Shovels Shop time limit per test 2 seconds memory limit per test 256 megabytes input standard inp ...

  4. [Codeforces 1201D]Treasure Hunting(DP)

    [Codeforces 1201D]Treasure Hunting(DP) 题面 有一个n*m的方格,方格上有k个宝藏,一个人从(1,1)出发,可以向左或者向右走,但不能向下走.给出q个列,在这些列 ...

  5. Codeforces Round #552 (Div. 3) F. Shovels Shop (前缀和预处理+贪心+dp)

    题目:http://codeforces.com/contest/1154/problem/F 题意:给你n个商品,然后还有m个特价活动,你买满x件就把你当前的x件中最便宜的y件价格免费,问你买k件花 ...

  6. Codeforces Round #552 (Div. 3) F. Shovels Shop(dp)

    题目链接 大意:给你n个物品和m种优惠方式,让你买k种,问最少多少钱. 思路:考虑dpdpdp,dp[x]dp[x]dp[x]表示买xxx种物品的最少花费,然后遍历mmm种优惠方式就行转移就好了. # ...

  7. Educational Codeforces Round 9 E. Thief in a Shop dp fft

    E. Thief in a Shop 题目连接: http://www.codeforces.com/contest/632/problem/E Description A thief made hi ...

  8. F. Shovels Shop 背包DP

    题意: 商店里有n把铲子 每个铲子有其标价 一个人要买k吧 有m个优惠政策 每个优惠政策有两个元素x,y 表示   正好买x个铲子的时候  这x个铲子中最便宜的y个铲子免单 求用最少的前买到k个铲子 ...

  9. Codeforces 1154F (DP)

    题意:有一个人去买铲子,他需要买正好k把.每把铲子有个标价,并且每把铲子最多只能被买一次.有m种优惠方案,每个优惠方案xi, yi是指如果这次恰好购买了xi把铲子,那么这次购买的铲子中最便宜的yi把将 ...

随机推荐

  1. UOJ #109「APIO2013」TASKSAUTHOR

    貌似是最入门的题答题 刚好我就是入门选手 就这样吧 UOJ #109 题意 太热了不讲了 $ Solution$ 第一个点:$ 105$个数字卡掉$ Floyd$ 直接$101$个点无出边一次询问就好 ...

  2. mapState

    store.js import Vue from 'vue' import Vuex from 'vuex' Vue.use(Vuex) const store = new Vuex.Store({ ...

  3. css基础二

    1,文本 文本颜色: <style> body {color:red;} /*为body的所有字体设置字体颜色为红色*/ h1 {color:#00ff00;} /*为h1元素设置字体颜色 ...

  4. 写给自己看的新手java-环境配置

    环境:win10. 第一步:下载jdk (类似于 net framework ) 环境运行库.地址:http://www.oracle.com/technetwork/java/javase/down ...

  5. vue 动态变量值不变化

    caseData = { lists:[] }; vm = new Vue({ el: '.hs-mt', data: caseData }); function getlist(pid,id){ $ ...

  6. php curl使用

  7. 使用numpy 将0-1000 中所有偶数转成0 所有奇数转成1

  8. thinkphp3.2 删除缓存文件

    //删除后台缓存 public function ajaxcleanCache(){ $dir = "./Application/Runtime/Logs/Admin/"; if( ...

  9. Debian Jessie升级至Stretch小记

    昨天Debian Stretch正式发布.为了尝新,昨天晚上便从Jessie升到了Stretch.结果,早上起来发现系统已无法进入X视窗环境,且NVIDIA的官方驱动无法成功编译和安装.看来,每次系统 ...

  10. Ubuntu系统查看显卡型号和NVIDIA驱动版本

    查看GPU型号 lspci | grep -i nvidia 查看NVIDIA驱动版本 sudo dpkg --list | grep nvidia-*