题意略。

这个题目我开始题意理解得有点问题。本题的实质是在这个数列中选择一些数字,使得选出的这些数字之和最大,用dp来解。

我们先要明确:当我选择数列长度为2 * c时,不如把这个长度为2 * c的劈成两个c,这样对答案的贡献更大一些。

定义dp[i]为我在[i,n]中可谋取的最大贡献。

dp[i] = max{dp[k]} + earn[i,i + c - 1] (i + c <= k <= n - c - 1)。

可用单调队列优化。

详见代码:

#include<bits/stdc++.h>
#define maxn 100005
using namespace std;
typedef long long LL;LL ai[maxn],dp[maxn];
LL st[maxn][17],mm[maxn];
int que[maxn],head,tail,n,c;void init(){mm[0] = -1;for(int i = 1;i < maxn;++i){mm[i] = (i & (i - 1)) == 0 ? mm[i - 1] + 1 : mm[i - 1];}
}
void init_rmq(){for(int i = 1;i <= n;++i) st[i][0] = ai[i];for(int j = 1;j <= mm[n];++j){for(int i = 1;i + (1<<j) - 1 <= n;++i){st[i][j] = min(st[i][j - 1],st[i + (1<<(j - 1))][j - 1]);}}
}
LL rmq(int l,int r){LL k = mm[r - l + 1];return min(st[l][k],st[r - (1<<k) + 1][k]);
}int main(){init();while(scanf("%d%d",&n,&c) == 2){LL sum = 0;for(int i = 1;i <= n;++i){scanf("%lld",&ai[i]);sum += ai[i];}init_rmq();memset(dp,0,sizeof(dp));head = tail = 0;LL ans = 0;for(int i = n - c + 1;i >= 1;--i){dp[i] = dp[que[head]] + rmq(i,i + c - 1);ans = max(ans,dp[i]);while(head < tail && dp[que[tail - 1]] < dp[i + c - 1]) --tail;que[tail++] = i + c - 1;}printf("%lld\n",sum - ans);}return 0;
}

转载于:https://www.cnblogs.com/tiberius/p/8537540.html

CodeForces 940E相关推荐

  1. [Codeforces 940E]Cashback(dp+set)

    题目链接:http://codeforces.com/problemset/problem/940/E 思路:划分任意长度,每c长度区间可去除一个最小值,所以划分方法就是单独自己一个或者长度为c的区间 ...

  2. Codeforces 940E - Cashback

    940E - Cashback 思路: dp+rmq 可以证明最后划分的区间可以由长度为1和长度为c的区间组成的,这样就可以用O(n)的dp求了,区间最小值随便拿什么维护都可以 状态:dp[i]表示到 ...

  3. Cashback [CodeForces - 940E]

    http://codeforces.com/problemset/problem/940/E 题意 将数组a划分成若干段,使每段的f值之和最小,其中f值是区间内元素和减去前k/c(下取整)小的数. 分 ...

  4. codeforces 940E Cashback 有趣的dp

    题解 这么明显的一个dp,我怎么就没看出来呢?! 首先我们需要一些前提条件:任何划分出来的一个区间的长度不应该超过c. 如果这个区间长度大于c,那么设len=n∗c+klen=n∗c+klen=n*c ...

  5. [Codeforces 940E]Cashback

    Description 题库链接 给你两个整数 \(n,c\) ,以及一个数列 \(A\) ,让你将序列分为许多段.对于每一段,他的价值为序列内除了最小的 \(\left\lfloor\frac{le ...

  6. Codeforces 940E Cashback

    Cashback 题意:一共给你N个数, 然后将他们分成连续的子集, 每个集合可以删除 元素个数/c  个最小元素, 然后求每个集合删除元素后的总和. 题解:我们将集合分为1个元素或者K个元素,每K个 ...

  7. CodeForces - 940E Cashback (DP+思维模型)

    题意:给你长度为n的数列,一段序列的价值是,所有数的总和-最小的len/c的数的和,求如何分割数列,使得答案总和最小. 分析:一开始看到向下取整不外乎两种情况:一是用计算机处理,那么表明用暴力,emm ...

  8. codeforces 940E. Cashback(线性dp)

    传送门 题意:给出一个nnn个数的序列,要求将序列分成若干段,对于一段长度为kkk的自动删去最小的⌊kc⌋\left \lfloor \frac{k}{c} \right \rfloor⌊ck​⌋个数 ...

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

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

最新文章

  1. java内存模型-JMM
  2. std string与线程安全_详解linux系统中断线程的那些事
  3. 申请了团队blog,不知道能否给开通
  4. mysql resulttype_Mysql中结果集(mysql_result)与Traversable
  5. 计算机网络-基本概念(7)【网络层】-多协议标记交换MPLS
  6. SAP 电商云 Spartacus UI 的 proxy facade 是如何调用实际实现类
  7. react脚手架搭建项目目录介绍
  8. bzoj2424 [HAOI2010]订货 费用流
  9. CentOS-6.4 安装 PHP Memcached 扩展
  10. HDU-3337 Guess the number 测试输入数据
  11. MongoDB数据库和集合的基本操作
  12. android集成建行龙支付,龙支付及建行信用卡分期支付SDK
  13. linux apache找不到woff2,IIS Web部署: svg/woff/woff2字体找不到
  14. 加州大学欧文分校 计算机专业,加州大学欧文分校排名及各专业排名
  15. 图文笔记,带你走进《未来简史》(11-15)
  16. 贪吃的九头龙-----树形dp
  17. java 改变字体大小_java – 根据屏幕大小更改字体大小
  18. Fuzzy SVM with a new fuzzy membership function--文献翻译
  19. 代码打字速度_使用VueJS创建打字速度效果
  20. 一、Azure Kinect 传感器 SDK 下载——Azure Kinect DK入门

热门文章

  1. 【STM32】keil软件常用使用技巧
  2. 【Linux网络编程】无连接和面向连接协议
  3. 【Linux系统编程】信号 (上)
  4. pygame精灵组有哪些方法_小精灵科学室-如何在活动中提高幼儿的探究能力和科学探究活动?...
  5. mysql中整理设置__MySQL整理
  6. 每天一道LeetCode-----将用数组表示的整数加一,两个用字符串表示的(二进制)数相加
  7. Qt学习笔记-----信号槽
  8. html大学生活主题班会,“大学生活”主题班会记录范文
  9. Mysql(12)——inner join的用法
  10. 第一章 PX4-Pixhawk-程序编译过程解析