Codeforces Round #466 (Div. 2) E. Cashback(dp + 贪心)

题意:

给一个长度为\(n\)的序列\(a_i\),给出一个整数\(c\)

定义序列中一段长度为k的区间的贡献为区间和减去前\(\lfloor \frac{k}{c} \rfloor\)小数的和

现在要给序列\(a_i\)做一个划分,使得贡献的总和最小。

思路:

容易想到最裸的dp的思路

\(dp[i] = min(dp[j] + cost(j,i)) , j < i\), \(cost(j,i)\)就是区间[j,i]的贡献

这样暴力枚举复杂度是\(O(n ^ {2} log n)\)的

观察发现 划分成一段\(k * c\)的区间不会优于划分成\(k\)段长度为\(c\)的区间

同理分成非\(c\)的整数倍长度的区间是不会优于拆分成\(c\)的整数倍和一段长度小于\(c\)的区间

由于长度小于\(c\)的区间是没有贡献的,所以和拆成长度为1的区间是等价的。

所以最优的划分方式就是分成长度为1或者分成长度为c,再来做dp就可以了。

#include<bits/stdc++.h>
#define LL long long
using namespace std; const int N = 1e5 + 10;
const int inf = 0x3f3f3f3f;
int a[N];
int n, c;
int mi[N << 2];
LL dp[N],sum[N];
void build(int l,int r,int rt){
if(l == r){
scanf("%d",a + l);
mi[rt] = a[l];
return ;
}
int m = l + r >> 1;
build(l,m,rt<<1);
build(m+1,r,rt<<1|1);
mi[rt] = min(mi[rt<<1],mi[rt<<1|1]);
}
int querymi(int L,int R,int l,int r,int rt){
if(L <= l && R >= r) return mi[rt];
int ans = inf;
int m = l + r >> 1;
if(L <= m) ans = min(ans, querymi(L,R,l,m,rt<<1));
if(R > m) ans = min(ans,querymi(L,R,m+1,r,rt<<1|1));
return ans;
}
int main(){ scanf("%d%d",&n,&c);
build(1,n,1);
for(int i = 1;i <= n;i++) sum[i] = sum[i - 1] + a[i];
for(int i = 1;i <= n;i++){
dp[i] = dp[i - 1] + a[i];
if(i >= c){
dp[i] = min(dp[i], dp[i - c] + sum[i] - sum[i - c] - querymi(i - c + 1,i,1,n,1));
}
}
cout<<dp[n]<<endl;
return 0;
}

Codeforces Round #466 (Div. 2) E. Cashback的更多相关文章

  1. Codeforces Round #466 (Div. 2) 题解940A 940B 940C 940D 940E 940F

    Codeforces Round #466 (Div. 2) 题解 A.Points on the line 题目大意: 给你一个数列,定义数列的权值为最大值减去最小值,问最少删除几个数,使得数列的权 ...

  2. Codeforces Round #466 (Div. 2) Solution

    从这里开始 题目列表 小结 Problem A Points on the line Problem B Our Tanya is Crying Out Loud Problem C Phone Nu ...

  3. Codeforces Round #466 (Div. 2)

    所有的题目都可以在CodeForces上查看 中间看起来有很多场比赛我没有写了 其实是因为有题目没改完 因为我不想改,所以就没有写了(大部分题目还是改完了的) 我还是觉得如果是打了的比赛就一场一场写比 ...

  4. Codeforces Round #466 (Div. 2) -A. Points on the line

    2018-02-25 http://codeforces.com/contest/940/problem/A A. Points on the line time limit per test 1 s ...

  5. Codeforces Round #466 (Div. 2) 题解

    人生中第三次\(CF\)... 考试中切了\(A\)~\(E\) \(F\)题会做没时间写 题解 A:Points on the line 题意 给定一个数列,删最小的数,使最大差不大于一个定值 So ...

  6. Codeforces Round #466 (Div. 2) A. Points on the line[数轴上有n个点,问最少去掉多少个点才能使剩下的点的最大距离为不超过k。]

    A. Points on the line time limit per test 1 second memory limit per test 256 megabytes input standar ...

  7. Codeforces Round #466 (Div. 2) B. Our Tanya is Crying Out Loud[将n变为1,有两种方式,求最小花费/贪心]

    B. Our Tanya is Crying Out Loud time limit per test 1 second memory limit per test 256 megabytes inp ...

  8. Codeforces Round #366 (Div. 2) ABC

    Codeforces Round #366 (Div. 2) A I hate that I love that I hate it水题 #I hate that I love that I hate ...

  9. Codeforces Round #354 (Div. 2) ABCD

    Codeforces Round #354 (Div. 2) Problems     # Name     A Nicholas and Permutation standard input/out ...

随机推荐

  1. 【JUC源码解析】Exchanger

    简介 Exchanger,并发工具类,用于线程间的数据交换. 使用 两个线程,两个缓冲区,一个线程往一个缓冲区里面填数据,另一个线程从另一个缓冲区里面取数据.当填数据的线程将缓冲区填满时,或者取数据的 ...

  2. Qt Creator 下启动vim模式后,运行快捷键Ctrl+R失效解决方案

    首先开启vim后,Ctrl+R无法用 解决: 工具 -> 选项->FakeVim 转到Ex Command Mapping 搜索Run 底栏Regular expression 输入run ...

  3. JSON.parse() 与 eval()

    JSON(JavaScript Object Notation)是一种轻量级的数据格式,采用完全独立于语言的文本格式,是理想的数据交换格式.同时,JSON是Javascript原生格式,这意味着在ja ...

  4. jQuery的图片懒加载

    jQuery的图片懒加载 function imgLazyLoad(options) { var settings = { Id: $('img'), threshold: 100, effectsp ...

  5. 213. String Compression【LintCode java】

    Description Implement a method to perform basic string compression using the counts of repeated char ...

  6. day-20 tensorflow持久化之入门学习

    如果不对模型参数进行保存,当训练结束以后,模型也在内存中被释放,下一轮又需要对模型进行重新训练,有没有一种方法,可以利用之前已经训练好的模型参数值,直接进行模型推理或者继续训练?这里需要引入一个数据之 ...

  7. WebApi中利用Razor模板引擎来生成html

    在服务器端基于Razor来生成html的一个思路 using System.Web.Mvc; using System.IO; using System.Web.Routing; using Syst ...

  8. Redis+Keepalived高可用方案详细分析

    背景 目前,Redis集群的官方方案还处在开发测试中,未集成到稳定版中.且目前官方开发中的Redis Cluster提供的功能尚不完善(可参考官方网站或http://www.redisdoc.com/ ...

  9. SFTP服务器之创建普通用户

    这篇博客主要写以下几点: 1.介绍SFTP服务器 2.用SFTP服务器的root用户a创建普通用户 3.修改普通用户名称以及默认登入时的目录名称 4.创建普通用户踩过的坑以及收获 一.介绍SFTP服务 ...

  10. IE中的activex控件

    1.tree控件 DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><HTML><HE ...