HDU多校第六场 1007 Getting Your Money Back —— DP + 单调优化

2023-11-02 10:38

本文主要是介绍HDU多校第六场 1007 Getting Your Money Back —— DP + 单调优化,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目链接:点我啊╭(╯^╰)╮

题目大意:

    你的银行账户余额在 [ x , y ] [x,y] [x,y] 范围内
    你需要把它全部取出来,若取 x x x
    若当前余额 ≥ x ≥x x,则耗费 a a a 元取出 x x x
    若当前余额 < x <x x,则耗费 b b b 元,取出失败
    问全取出最坏情况下的最低耗费

解题思路:

    假设 a = = b a == b a==b,那么很明显是二分
    每次取中点,这样一定最贪心
    问题在于 a ≠ b a ≠ b a=b,那么中点就不一定是最贪心的
    所以要枚举中间每一个点


    发现答案与区间长度 y − x y-x yx 有关,与 [ x , y ] [x,y] [x,y] 无关
    但是发现 x = 0 x = 0 x=0 时,当我们取到 1 1 1 时,无论成功失败, 0 0 0 都不需要再取
    如果余额在 [ 1 , y ] [1,y] [1,y] ,当我们取到 2 2 2 时,如果失败,还要取 1 1 1
    所以分两种情况DP:
     d p [ i ] [ 0 ] dp[i][0] dp[i][0] 表示 左端点为 0 0 0 ,长度为 i i i 的答案, d p [ i ] [ 1 ] dp[i][1] dp[i][1] 则表示左端点不为 0 0 0
     d p [ i ] [ 0 ] = m i n ( m a x ( d p [ j − 1 ] [ 0 ] + b , d p [ i − j ] [ 0 ] + a ) ) dp[i][0] = min( max(dp[j-1][0] + b, dp[i-j][0] + a) ) dp[i][0]=min(max(dp[j1][0]+b,dp[ij][0]+a))
     d p [ i ] [ 1 ] = m i n ( m a x ( d p [ j − 1 ] [ 1 ] + b , d p [ i − j ] [ 0 ] + a ) ) dp[i][1] = min( max(dp[j-1][1] + b, dp[i-j][0] + a) ) dp[i][1]=min(max(dp[j1][1]+b,dp[ij][0]+a))


    枚举 j j j ,若 j j j 失败,则范围变为 [ x , j − 1 ] [x,j-1] [x,j1]
    若 j j j 成功,则变为 [ j − j , i − j ] = [ 0 , i − j ] [j-j, i-j] = [0, i-j] [jj,ij]=[0,ij]

    这样的 d p dp dp n 2 n^2 n2 的,很明显看出来区间长度越长,答案越大
    也就是 d p [ i ] [ 0 ] dp[i][0] dp[i][0] 单调不减,那么 m a x max max 里的函数就是一个单调不增,一个单调不减
    所以 m a x ( d p [ j − 1 ] [ 0 ] + b , d p [ i − j ] [ 0 ] + a ) max(dp[j-1][0] + b, dp[i-j][0] + a) max(dp[j1][0]+b,dp[ij][0]+a) ,就是先减后增
    所以对与某一个 i i i ,设其决策点为 j j j
    易得对于 > i >i i 的点,其决策点 j j j 只会往后移
    均摊时间复杂度: O ( n ) O(n) O(n)

核心:DP + 单调优化

#include<bits/stdc++.h>
#define rint register int
#define deb(x) cerr<<#x<<" = "<<(x)<<'\n';
using namespace std;
typedef long long ll;
const int maxn = 2e5 + 5;
int T, x, y, a, b; 
ll dp[maxn][2];ll slope0(int j, int i){return max(dp[j-1][0] + b, dp[i-j][0] + a);
}
ll slope1(int k, int i){return max(dp[k-1][1] + b, dp[i-k][0] + a);
}int main() {scanf("%d", &T);while(T--){scanf("%d%d%d%d", &x, &y, &a, &b);int n = y - x;dp[0][0] = 0, dp[0][1] = a;for(int i=1, j=1, k=1; i<=n; i++){while(j<i && slope0(j+1, i) <= slope0(j, i)) j++;while(k<i && slope1(k+1, i) <= slope1(k, i)) k++;dp[i][0] = slope0(j, i), dp[i][1] = slope1(k, i);}printf("%lld\n", dp[n][x>0]);}
}

这篇关于HDU多校第六场 1007 Getting Your Money Back —— DP + 单调优化的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/330021

相关文章

SpringBoot中HTTP连接池的配置与优化

《SpringBoot中HTTP连接池的配置与优化》这篇文章主要为大家详细介绍了SpringBoot中HTTP连接池的配置与优化的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一... 目录一、HTTP连接池的核心价值二、Spring Boot集成方案方案1:Apache HttpCl

PyTorch高级特性与性能优化方式

《PyTorch高级特性与性能优化方式》:本文主要介绍PyTorch高级特性与性能优化方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、自动化机制1.自动微分机制2.动态计算图二、性能优化1.内存管理2.GPU加速3.多GPU训练三、分布式训练1.分布式数据

MySQL中like模糊查询的优化方案

《MySQL中like模糊查询的优化方案》在MySQL中,like模糊查询是一种常用的查询方式,但在某些情况下可能会导致性能问题,本文将介绍八种优化MySQL中like模糊查询的方法,需要的朋友可以参... 目录1. 避免以通配符开头的查询2. 使用全文索引(Full-text Index)3. 使用前缀索

C#实现高性能Excel百万数据导出优化实战指南

《C#实现高性能Excel百万数据导出优化实战指南》在日常工作中,Excel数据导出是一个常见的需求,然而,当数据量较大时,性能和内存问题往往会成为限制导出效率的瓶颈,下面我们看看C#如何结合EPPl... 目录一、技术方案核心对比二、各方案选型建议三、性能对比数据四、核心代码实现1. MiniExcel

MySQL索引的优化之LIKE模糊查询功能实现

《MySQL索引的优化之LIKE模糊查询功能实现》:本文主要介绍MySQL索引的优化之LIKE模糊查询功能实现,本文通过示例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录一、前缀匹配优化二、后缀匹配优化三、中间匹配优化四、覆盖索引优化五、减少查询范围六、避免通配符开头七、使用外部搜索引擎八、分

Python通过模块化开发优化代码的技巧分享

《Python通过模块化开发优化代码的技巧分享》模块化开发就是把代码拆成一个个“零件”,该封装封装,该拆分拆分,下面小编就来和大家简单聊聊python如何用模块化开发进行代码优化吧... 目录什么是模块化开发如何拆分代码改进版:拆分成模块让模块更强大:使用 __init__.py你一定会遇到的问题模www.

SpringBoot首笔交易慢问题排查与优化方案

《SpringBoot首笔交易慢问题排查与优化方案》在我们的微服务项目中,遇到这样的问题:应用启动后,第一笔交易响应耗时高达4、5秒,而后续请求均能在毫秒级完成,这不仅触发监控告警,也极大影响了用户体... 目录问题背景排查步骤1. 日志分析2. 性能工具定位优化方案:提前预热各种资源1. Flowable

SpringBoot3实现Gzip压缩优化的技术指南

《SpringBoot3实现Gzip压缩优化的技术指南》随着Web应用的用户量和数据量增加,网络带宽和页面加载速度逐渐成为瓶颈,为了减少数据传输量,提高用户体验,我们可以使用Gzip压缩HTTP响应,... 目录1、简述2、配置2.1 添加依赖2.2 配置 Gzip 压缩3、服务端应用4、前端应用4.1 N

Spring Boot + MyBatis Plus 高效开发实战从入门到进阶优化(推荐)

《SpringBoot+MyBatisPlus高效开发实战从入门到进阶优化(推荐)》本文将详细介绍SpringBoot+MyBatisPlus的完整开发流程,并深入剖析分页查询、批量操作、动... 目录Spring Boot + MyBATis Plus 高效开发实战:从入门到进阶优化1. MyBatis

MyBatis 动态 SQL 优化之标签的实战与技巧(常见用法)

《MyBatis动态SQL优化之标签的实战与技巧(常见用法)》本文通过详细的示例和实际应用场景,介绍了如何有效利用这些标签来优化MyBatis配置,提升开发效率,确保SQL的高效执行和安全性,感... 目录动态SQL详解一、动态SQL的核心概念1.1 什么是动态SQL?1.2 动态SQL的优点1.3 动态S