Codeforces 940 E.Cashback

题意:一组数,要分为若干个区间,每个区间长度为ki(1<=ki<=n),并且对于每个区间删去前ki/c(向下取整)个小的数(即对区间升序排序后的前ki/c个数),要求找出最佳的划分方案使所有最终数组的和最小
思路:通过观察和分析
①一个长度2*c的区间总是不会优于把它划分成两个长度为c的区间
②在一个长度为c的区间后面添不超过c个数,都不会使删掉的数之和变大,还可能更小。
因此得到dp状态与转移方程:
dp[i]:前i个数最大可删掉数之和
dp[i]=max( dp[i-1], dp[i-c]+min{ a[k](i-c<k<=i) } )
转移的时候,RMQ问题可以用单调队列或者ST表解决。

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<map>
#include<queue>
#include<string>
#include<vector>
#include<cmath>
#include<climits>
#include<functional>
#include<set>
#define dd(x) cout<<#x<<" = "<<x<<" "
#define de(x) cout<<#x<<" = "<<x<<endl
#define fi first
#define se second
#define mp make_pair
#define pb push_back
using namespace std;
typedef long long ll;
typedef pair<int,int> P;
typedef vector<int> V;
typedef map<int,int> M;
typedef queue<int> Q;
typedef priority_queue<int> BQ;
typedef priority_queue<int,vector<int>,greater<int> > SQ;
const int maxn=1e5+10,INF=0x3f3f3f3f;
ll h,t,q[maxn],a[maxn],dp[maxn];
int main()
{int n,c;ll ans=0;scanf("%d%d",&n,&c);for (int i=1;i<=n;++i){scanf("%lld",&a[i]);ans+=a[i];}for (int i=1;i<=n;++i){while (t>h&&q[h]<=i-c)++h;while (t>h&&a[q[t-1]]>=a[i])--t;q[t++]=i;dp[i]=dp[i-1];if (i-c>=0)dp[i]=max(dp[i],dp[i-c]+a[q[h]]);}printf("%lld",ans-dp[n]);return 0;
}

转载于:https://www.cnblogs.com/orangee/p/9732941.html

Codeforces 940 E.Cashback (单调队列,dp)相关推荐

  1. codeforces - 1216F WIFI(单调队列+DP)

    传送门 题意:有n个房间,需要把n个房间全部连上网,可以使用i的代价直接将第i个房间连上网.有一些房间可以放路由器,代价也是他的标号i,路由器可以使得i-k,到i+k之间所有房间通上网,求最小代价使得 ...

  2. bzoj1791,P4381-[IOI2008]Island【基环树,树形dp,单调队列dp,树的直径】

    正题 评测记录:https://www.luogu.org/recordnew/lists?uid=52918&pid=P4381 题目大意 有n个岛,n条无向边(保证每个岛都有边连到).走过 ...

  3. P3580 [POI2014]ZAL-Freight(单调队列dp)

    P3580 [POI2014]ZAL-Freight(单调队列dp) 考虑两辆车怎么样是最优的. t1,t2,St_1,t_2,St1​,t2​,S t1+St_1+St1​+S 第一辆车:[t1,t ...

  4. Codeforces Round #466 (Div. 2): E. Cashback(单调队列+DP)

    题目链接:http://codeforces.com/contest/940/problem/E 题意:给你一个长为n的序列和一个数字c,你要将这个序列切成若干段,对于每一段,这段中最小的[n/c]个 ...

  5. Codeforces 940E: Cashback 单调队列优化DP

    传送门 题目描述 给你一个长度为n的数列a和整数c 你需要把它任意分段 每一段假设长度为k,就去掉前 ⌊kc⌋\lfloor\frac{k}{c}\rfloor⌊ck​⌋小的数 最小化剩下的数的和 分 ...

  6. 【CF940E】Cashback(单调队列dp)

    传送门 Solution: 既然是删掉k/c个,那么k<c是不删除的无意义,k=c删除1个,c<=k<2c还是删除1个,那么相当于第c+1个到第k个放在上一区间是无意义的.证明:假如 ...

  7. 刷题总结——烽火传递(单调队列+dp)

    题目: 题目描述 烽火台又称烽燧,是重要的防御设施,一般建在险要处或交通要道上.一旦有敌情发生,白天燃烧柴草,通过浓烟表达信息:夜晚燃烧干柴,以火光传递军情.在某两座城市之间有 n 个烽火台,每个烽火 ...

  8. POJ 1821 单调队列+dp

    题目大意:有K个工人,有n个墙,现在要给墙涂色.然后每个工人坐在Si上,他能刷的最大范围是Li,且必须是一个连续子区间,而且必须过Si,他刷完后能获得Pi钱 思路:定义dp[i][j]表示前i个人,涂 ...

  9. P3957-跳房子【单调队列,dp,二分】

    前言 链接: https://www.luogu.org/record/show?rid=7915892 这就是之前普及组的第四题- 大意 有n个格子,每个格子有价值.机器人有固定的跳跃距离d,用k个 ...

最新文章

  1. 算法及其复杂度度量简介
  2. 【Linux】Linux简单操作之文件管理
  3. LeetCode 204. Count Primes--从一开始的质数个数--Python解法--面试算法题
  4. python读取excel表格-python读取excel表格中的数据
  5. (DT系列五)Linux kernel 是怎么将 devicetree中的内容生成plateform_device【转】
  6. [云炬创业学笔记]第二章决定成为创业者测试17
  7. Linux中的基础IO(一)
  8. 工作109:路由菜单项
  9. mysql 更改一行_mysql怎么修改数据表里一行数据?
  10. c开头英文语言,C开头的考研英语词汇
  11. 生活中的英语 —— 动植物篇
  12. hdoj1003+codeup2086:Max Sum最大连续子序列和(dp基础题+dp入门-----分治/遍历求和/dp)
  13. 中国价格统计年鉴(2013-2021年)
  14. 网络层———IPv4(1)
  15. css背景图与html插入img的区别,css背景图与html插入img的区别
  16. 《如何有效阅读一本书》:读再多书,不如先学会如何读书
  17. D. Drunk Passenger(数学概率)
  18. python forward函数___call__、__init__和 forward三个函数在python中的调用方法
  19. java获取京东token_京东宙斯平台使用方法(accesstoken,appkey,appsecret参数和SDK的获取)...
  20. 为什么要把DAO作为接口 再用impl类来实现?

热门文章

  1. 豌豆荚研发管理经验分享-软件项目管理及绩效考核方法
  2. 连续第4年派息,动荡行情下挚文集团彰显稳健属性
  3. 荒野行动系统推荐观战榜_荒野行动 实力围观枪神 观战系统有学问
  4. java任务调度定时器,从零开始学 Java - Spring 使用 Quartz 任务调度定时器
  5. Windows 2008R2 Tomcat环境变量配置
  6. ElasticSearch 分词器
  7. C# Console.WriteLine()函数中{}输出格式详解
  8. 双软认定流程及所需材料有哪些
  9. 我的世界服务器物品复制,我的世界服务器复制物品bug2018 | 手游网游页游攻略大全...
  10. 依赖属性之“风云再起”五