dp优化----单调队列解决定长连续区间最小值。 例题:Cashback--- 题解

E. Cashback

题目大意:

思路解析:

如果c==1,那么无论如何 答案都为0.
如果c!=1,我们考虑如果最优答案有一段区间长度小于c,那么它对答案的贡献值,等于将这个区间划分为长度为1的多个小段,

如果有一段区间长度大于c小于2 * c,那么相当于在里面找到需要删除的数在其旁划分出一个长度为c的区间,其余部分都划分长度为1的小区间。

如果有区间长度等于2*c,那么把c划分为两个长度为c的区间,只能一个区间删除一个对于这个区间长度为2*c才是等价的(其余情况,划分为单个长度为c的区间对于整体答案更加优秀)。说明无论如何将整体划分长度为1或者长度为n的区间是最优选择。

代码实现:

import java.io.*;
import java.math.BigInteger;
import java.util.*;public class Main {public static void main(String[] args) throws IOException {int n = input.nextInt();int c = input.nextInt();int[] arr = new int[n + 1];int[] min = new int[n + 1];long[] dp = new long[n + 1];long[] sum = new long[n + 1];for (int i = 1; i <= n; i++) {arr[i] = input.nextInt();sum[i] = sum[i - 1] + arr[i];}LinkedList<Integer> list = new LinkedList<>();for (int i = 1; i <= Math.min(c, n); i++) {if (list.isEmpty()){list.add(i);}else{int j = list.getLast();if(arr[j] <= arr[i]){list.add(i);}else{while (arr[list.getLast()] > arr[i]){list.removeLast();if (list.isEmpty()) break;}list.add(i);}}min[i] = arr[list.getFirst()];}for (int i = c + 1; i <= n; i++) {while (!list.isEmpty() && list.getFirst() <= i - c) list.remove();if (list.isEmpty()){list.add(i);}else{int j = list.getLast();if(arr[j] <= arr[i]){list.add(i);}else{while (arr[list.getLast()] > arr[i]){list.removeLast();if (list.isEmpty()) break;}list.add(i);}}min[i] = arr[list.getFirst()];}for (int i = 1; i <= n; i++) {if (i >= c)dp[i] = Math.min(dp[i - 1] + arr[i], dp[i - c] + sum[i] - sum[i - c] - min[i]);else dp[i] = dp[i - 1] + arr[i];}out.println(dp[n]);out.flush();out.close();br.close();}static PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));static Input input = new Input(System.in);static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));static class Input {public BufferedReader reader;public StringTokenizer tokenizer;public Input(InputStream stream) {reader = new BufferedReader(new InputStreamReader(stream), 32768);tokenizer = null;}public String next() {while (tokenizer == null || !tokenizer.hasMoreTokens()) {try {tokenizer = new StringTokenizer(reader.readLine());} catch (IOException e) {throw new RuntimeException(e);}}return tokenizer.nextToken();}public String nextLine() {String str = null;try {str = reader.readLine();} catch (IOException e) {// TODO 自动生成的 catch 块e.printStackTrace();}return str;}public int nextInt() {return Integer.parseInt(next());}public long nextLong() {return Long.parseLong(next());}public Double nextDouble() {return Double.parseDouble(next());}public BigInteger nextBigInteger() {return new BigInteger(next());}}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/442899.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Midjourney】关于标准模型的几个按钮都有什么用

当用户在Midjourney Bot所在的服务发送/settings命令时就能调出设置窗口&#xff0c;本文将介绍该窗口中的各个按钮都有什么作用。 1.RAW Mode 依照官方的描述来看V5.2模型似乎带有自动优化功能&#xff0c;会对用户输入的关键词空白描述进行补全和优化&#xff0c;以便修复所…

与音乐共同奔跑:南卡/韶音/墨觉三款骨传导耳机的真实试用体验

作为一个热爱运动的音乐迷&#xff0c;跑步与听歌对我来说是一场每天必须的灵魂邂逅。没有音乐&#xff0c;我跑步的脚步就仿佛失去了节奏&#xff0c;每一步都沉重异常&#xff1b;有了音乐&#xff0c;每一次呼吸都充满了动力&#xff0c;仿佛我能一跃而过山丘&#xff0c;跃…

【日常总结】如何快速迁移Navicat中的全部连接设置到新安装的Navicat中?

一、场景 二、需求 三、解决方案 Stage 1&#xff1a;“文件”-->“导出连接”。 Stage 2&#xff1a;获取备份文件 connections.ncx Stage 3&#xff1a;导入connections.ncx 四、不足 一、场景 公司电脑换新&#xff0c;所有软件需要重装&#xff0c;包括navicat 1…

机器学习 | 掌握线性回归的实战技巧

目录 初识线性回归 损失和优化 欠拟合与过拟合 正则化线性模型 模型的保存与加载 初识线性回归 线性回归(Linearregression)是利用回归方程(函数)对一个或多个自变量(特征值)和因变量(目标值)之间关系进行建模的一种分析方式。特点是&#xff1a;有一个自变量的情况称为单…

Python算法题集_滑动窗口最大值

本文为Python算法题集之一的代码示例 题目239&#xff1a;滑动窗口最大值 说明&#xff1a;给你一个整数数组 nums&#xff0c;有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回 滑动窗…

Redis -- 背景知识

目录 特性 为啥Redis快? 应用场景 Redis不能做什么&#xff1f; Redis是在内存中存储数据的一个中间件&#xff0c;用作为数据库&#xff0c;也可以用作为缓存&#xff0c;在分布式中有很高的威望。 特性 In-memory data structures&#xff1a;在内存中存储数据key-val…

Linux Centos stream9 mdadm

RAID(Redundant Array of Independent Disk独立冗余磁盘阵列)技术是加州大学伯克利分校1987年提出&#xff0c;最初是为了组合小的廉价磁盘来代替大的昂贵磁盘&#xff0c;同时希望磁盘失效时不会使对数据的访问受损失而开发出一定水平的数据保护技术。RAID就是一种由多块廉价磁…

牛客——二分(差分数组前缀和)

链接&#xff1a;登录—专业IT笔试面试备考平台_牛客网 来源&#xff1a;牛客网 题目描述 我们刚刚学了二分查找——所谓二分查找就是在一堆有序数里找某个符合要求的数。在学完二分查找之后如果让你玩猜数游戏&#xff08;裁判选定一个目标数字&#xff0c;你说一个数裁判…

鸿蒙开发之app快速备案流程

App备案快速入门知识 1、 准备材料 1、阿里云APP &#xff08;用于人脸识别认证&#xff09; 2、身份证原件&#xff08;用于拍照上传身份证照片&#xff0c;阿里云APP不支持本地上传照片&#xff0c;只能拍照&#xff09; 3、一个主办单位负责人联系电话&#xff08;该号码必…

带大家做一个,易上手的家常香干炒韭菜

两瓣蒜 一块生姜 生姜切小片 和 四个左右干辣椒一起装起来 蒜切小片 装起来 准备一把韭菜 韭菜 切成段 准备两个香干豆腐 香干豆腐切片备用 起锅烧油 热后 下入生姜 干辣椒炒香 然后下入香干翻炒 翻炒均匀后 下入 半勺老抽 一勺生抽 适量蚝油 翻炒均匀后 下入蒜片 …

在 WLC上配置WPA2-Enterprise WLAN

实验大纲 第1部分&#xff1a;创建一个新的WLAN 第1步&#xff1a;创建一个新的VLAN接口 第2步&#xff1a;配置WLC让它使用RADIUS服务器 第3步&#xff1a;创建一个新的WLAN 第4步&#xff1a;配置WLAN安全策略 第2部分&#xff1a;配置DHCP范围和SNMP 第1步&#xff1…

MySQL十部曲之一:MySQL概述及手册说明

文章目录 数据库、数据库管理系统以及SQL之间的关系关系型数据库与非关系型数据库MySQL程序系统变量系统状态变量SQL模式MySQL数据目录手册语法约定 数据库、数据库管理系统以及SQL之间的关系 名称说明数据库&#xff08;Database&#xff09;即存储数据的仓库&#xff0c;其本…