算法竞赛备赛之斜率优化的DP问题

目录

1.任务安排1

2.任务安排2

3.任务安排3

4.运输小猫


在处理下图的最小截距问题上面,我们该如何在维护的凸包中找到战距最小的点?

uTools_1692367332949

相当于在一个单调的队列中,找到第一个大于某一个数的点。

  1. 斜率单调递增,新加的点的横坐标也单调递增。

    1. 在查询的时候,可以将队头小于当前斜率的点全部删掉。

    2. 在插入的时候,将队尾所有不在凸包上的点全部删掉。

  2. 当斜率不再具有单调性,但是新加的点的横坐标一定单调递增。

    1. 在查询的时候,只能二分来查找

    2. 在插入的时候,将队尾所有不在鼓包上的点全部删掉。

1.任务安排1

300.有 N 个任务排成一个序列在一台机器上等待执行,它们的顺序不得改变。

机器会把这 N 个任务分成若干批,每一批包含连续的若干个任务。

从时刻 0 开始,任务被分批加工,执行第 i 个任务所需的时间是 Ti。

另外,在每批任务开始前,机器需要 S 的启动时间,故执行一批任务所需的时间是启动时间 S 加上每个任务所需时间之和。

一个任务执行后,将在机器中稍作等待,直至该批任务全部执行完毕。

也就是说,同一批任务将在同一时刻完成。

每个任务的费用是它的完成时刻乘以一个费用系数 Ci。

请为机器规划一个分组方案,使得总费用最小。

#include<iostream>
#include<algorithm>
#include<cstring>
​
using namespace std;
​
const int N = 5010;
​
int n, s;
int sumt[N], sumc[N];
int f[N];
int q[N];
​
int main()
{scanf("%d%d", &n, &s);for(int i = 1;i <= n; i++){int t, c;scanf("%d%d", &t, &c);sumt[i] = sumt[i - 1] + t;sumc[i] = sumc[i - 1] + c;}memset(f, 0x3f, sizeof(f));f[0] = 0;for(int i = 1;i <= n; i++)for(int j = 0;j < i; j++)f[i] = min(f[i], f[j] + sumt[i] * (sumc[i] - sumc[j]) + s * (sumc[n] - sumc[j]));printf("%d\n", f[n]);return 0;
}

但是因为后来是数据加强了,不得不用long long来处理相应的问题。

可以用如下代码处理:

#include <iostream>
#include <cstring>
​
using namespace std;
​
typedef long long LL;
​
const int N = 5050;
​
int n, s;
LL st[N], sc[N];
LL f[N];
​
int main()
{scanf("%d%d", &n, &s);for (int i = 1; i <= n; i ++ ){scanf("%d%d", &st[i], &sc[i]);st[i] += st[i - 1], sc[i] += sc[i - 1];}memset(f, 0x3f, sizeof f);f[0] = 0;for (int i = 1; i <= n; i ++ )for (int j = 0; j < i; j ++ )f[i] = min(f[i], f[j] + st[i] * (sc[i] - sc[j]) + s * (sc[n] - sc[j]));printf("%lld\n", f[n]);return 0;
}

2.任务安排2

301.有 N 个任务排成一个序列在一台机器上等待执行,它们的顺序不得改变。

机器会把这 N 个任务分成若干批,每一批包含连续的若干个任务。

从时刻 0 开始,任务被分批加工,执行第 i 个任务所需的时间是 Ti。

另外,在每批任务开始前,机器需要 S 的启动时间,故执行一批任务所需的时间是启动时间 S 加上每个任务所需时间之和。

一个任务执行后,将在机器中稍作等待,直至该批任务全部执行完毕。

也就是说,同一批任务将在同一时刻完成。

每个任务的费用是它的完成时刻乘以一个费用系数 Ci。

请为机器规划一个分组方案,使得总费用最小。

和上一题相比,就是N的数据域扩张了。

1≤N≤3×105

1≤Ti,Ci≤512

0≤S≤512

#include<iostream>
#include<algorithm>
#include<cstring>
​
using namespace std;
​
typedef long long LL;
​
const int N = 300010;
​
int n, s;
LL c[N], t[N];
LL f[N];
LL q[N];
​
int main()
{scanf("%d%d", &n, &s);for(int i = 1;i <= n; i++){scanf("%lld%lld", &t[i], &c[i]);t[i] += t[i - 1];c[i] += c[i - 1];}int hh = 0, tt = 0;q[0] = 0;for(int i = 1;i <= n; i++){while(hh < tt && (f[q[hh + 1]] - f[q[hh]]) <= (t[i] + s) * (c[q[hh + 1]] - c[q[hh]])) hh++;int j = q[hh];f[i] = f[j] - (t[i] + s) * c[j] + t[i] * c[i] + s * c[n];while(hh < tt && ((f[q[tt]] - f[q[tt - 1]]) * (c[i] - c[q[tt]])) >= (f[i] - f[q[tt]]) * (c[q[tt]] - c[q[tt - 1]])) tt--;q[++tt] = i;}printf("%d\n", f[n]);return 0;
}

3.任务安排3

有 N 个任务排成一个序列在一台机器上等待执行,它们的顺序不得改变。

机器会把这 N 个任务分成若干批,每一批包含连续的若干个任务。

从时刻 0 开始,任务被分批加工,执行第 i 个任务所需的时间是 Ti。

另外,在每批任务开始前,机器需要 S 的启动时间,故执行一批任务所需的时间是启动时间 S 加上每个任务所需时间之和。

一个任务执行后,将在机器中稍作等待,直至该批任务全部执行完毕。

也就是说,同一批任务将在同一时刻完成。

每个任务的费用是它的完成时刻乘以一个费用系数 Ci。

请为机器规划一个分组方案,使得总费用最小。

1≤N≤3×105

0≤S,Ci≤512

−512≤Ti≤512

与任务安排2相比,Ti存在负值。

#include<iostream>
#include<algorithm>
#include<cstring>
​
using namespace std;
​
typedef long long LL;
​
const int N = 300010;
​
int n, s;
LL t[N], c[N];
LL f[N];
int q[N];
​
int main()
{scanf("%d%d", &n, &s);for(int i = 1;i <= n; i++){scanf("%lld%lld", &t[i], &c[i]);t[i] += t[i - 1];c[i] += c[i - 1];}int hh = 0, tt = 0;q[0] = 0;for(int i = 1;i <= n; i++){int l = hh, r = tt;while(l < r){int mid = l + r >> 1;if(f[q[mid + 1]] - f[q[mid]] > (t[i] + s) * (c[q[mid + 1]] - c[q[mid]])) r = mid;else l = mid + 1;}int j = q[r];f[i] = f[j] - (t[i] + s) * c[j] + t[i] * c[i] + s * c[n];while(hh < tt && (f[q[tt]] - f[q[tt - 1]]) * (c[i] - c[q[tt]]) >= (f[i] - f[q[tt]]) * (c[q[tt]] - c[q[tt - 1]])) tt--;q[++tt] = i;}printf("%lld\n", f[n]);return 0;
}

4.运输小猫

303.小 S 是农场主,他养了 M 只猫,雇了 P 位饲养员。

农场中有一条笔直的路,路边有 N 座山,从 1 到 N 编号。

第 ii 座山与第 i−1 座山之间的距离为 Di。

饲养员都住在 1 号山。

有一天,猫出去玩。

第 ii 只猫去 Hi 号山玩,玩到时刻 Ti 停止,然后在原地等饲养员来接。

饲养员们必须回收所有的猫。

每个饲养员沿着路从 1 号山走到 N 号山,把各座山上已经在等待的猫全部接走。

饲养员在路上行走需要时间,速度为 1 米/单位时间。

饲养员在每座山上接猫的时间可以忽略,可以携带的猫的数量为无穷大。

例如有两座相距为 1 的山,一只猫在 2 号山玩,玩到时刻 3 开始等待。

如果饲养员从 1 号山在时刻 2 或 3 出发,那么他可以接到猫,猫的等待时间为 0 或 1。

而如果他于时刻 1 出发,那么他将于时刻 2 经过 2 号山,不能接到当时仍在玩的猫。

你的任务是规划每个饲养员从 1 号山出发的时间,使得所有猫等待时间的总和尽量小。

饲养员出发的时间可以为负。

输入格式

第一行包含三个整数 N,M,P

第二行包含 n−1 个整数,D2,D3,…,DN

接下来 M 行,每行包含两个整数 Hi 和 Ti。

#include<iostream>
#include<algorithm>
#include<cstring>
​
using namespace std;
​
typedef long long LL;
​
const int N = 1e5 + 10, M = 1e5 + 10, P = 110;
​
int n, m, p;
LL d[N], t[N], a[N], s[N];
LL f[P][M];
int q[M];
​
LL get_y(int k, int j)
{return f[j - 1][k] + s[k];
}
​
int main()
{scanf("%d%d%d", &n, &m, &p);for(int i = 2;i <= n; i++){scanf("%lld", &d[i]);d[i] += d[i - 1];}for(int i = 1;i <= m; i++){int h;scanf("%d%lld", &h, &t[i]);a[i] = t[i] - d[h];}sort(a + 1, a + m + 1);for(int i = 1;i <= m; i++) s[i] = s[i - 1] + a[i];memset(f, 0x3f, sizeof f);for(int i = 0;i <= p; i++) f[i][0] = 0;for(int j = 1;j <= p; j++){int hh = 0, tt = 0;q[0] = 0;for(int i = 1;i <= m; i++){while(hh < tt && (get_y(q[hh + 1], j) - get_y(q[hh], j)) <= a[i] * (q[hh + 1] - q[hh])) hh++;int k = q[hh];f[j][i] = f[j - 1][k] - a[i] * k + s[k] + a[i] * i - s[i];while(hh < tt && (get_y(q[tt], j) - get_y(q[tt - 1], j)) * (i - q[tt]) >= (get_y(i, j) - get_y(q[tt], j)) * (q[tt] - q[tt - 1])) tt--;q[++tt] = i;}}printf("%lld", f[p][m]);return 0;
}

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

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

相关文章

如何判断一个元素是否在可视区域中?

文章目录 一、用途二、实现方式offsetTop、scrollTopgetBoundingClientRectIntersection Observer创建观察者传入被观察者 三、案例分析参考文献 一、用途 可视区域即我们浏览网页的设备肉眼可见的区域&#xff0c;如下图 在日常开发中&#xff0c;我们经常需要判断目标元素是…

AcWing 860. 染色法判定二分图

本题链接 &#xff1a;活动 - AcWing 题目&#xff1a; 样例&#xff1a; 输入 4 4 1 3 1 4 2 3 2 4 输出 Yes 思路&#xff1a; 根据题目意思&#xff0c;我们明确一下二分图的含义。 二分图是图论中的一个重要概念。一个图被称为二分图&#xff0c;当且仅当能够将其所有顶…

今日早报 每日精选15条新闻简报 每天一分钟 知晓天下事 2月27日,星期二

每天一分钟&#xff0c;知晓天下事&#xff01; 2024年2月27日 星期二 农历正月十八 1、 应急管理部&#xff1a;彻查各类消防隐患&#xff0c;集中治理电动自行车进楼入户。 2、 电动车引发火灾事故频发&#xff0c;强制性国家标准即将出台。 3、 医保局&#xff1a;近年来纳…

vite+vue3图片引入方式不生效解决方案

vitevue3图片引入方式不生效解决方案 引入方式改成 const wordImgnew URL(/src/assets/MicsosoftWord.png,import.meta.url).href;原理

代码随想录Leetcode518. 零钱兑换 II

题目&#xff1a; 代码(首刷看解析&#xff09;&#xff1a; 这里的这个递推公式可以这么理解&#xff1a; 想象二维数组dp[ i ][ j ]其中i表示用前i种硬币&#xff0c;j表示价值总金额。dp[i][j]表示总方法数量。 那么dp[i][j]意义为&#xff1a; 用前i种硬币凑j的价值&…

Programming Abstractions in C阅读笔记:p303-p305

《Programming Abstractions in C》学习第74天&#xff0c;p303-p305总结&#xff0c;总计3页。 一、技术总结 1.时间复杂度分类(complexity classes) ClassNotationExampleconstantO(1)Returning the first element in an arraylogarithmicO(logN)Binary search in a sorte…

【SRE系列之Jenkins的使用】--实现ssh和http克隆

1、Jenkins的概念 1.1Jenkins的介绍 Jenkins是一个独立的开源软件项目&#xff0c;是基于Java开发的一种CI&#xff08;Continuous integration&#xff0c;持续集成&#xff09; &CD (Continuous Delivery&#xff0c;持续交付)工具&#xff0c;用于监控持续重复的工作&a…

简单聊聊现在的AI

简单聊聊现在的AI 前言主要的AI模型和形式LLM - Large Language Model&#xff08;大语言模型&#xff09;BOT&#xff08;机器人&#xff09;LAM - Large Action Models&#xff08;大行动模型&#xff09;Agent&#xff08;智能体&#xff09; 结尾 前言 好久没回来写博客&a…

LeetCode--72

72. 编辑距离 给你两个单词 word1 和 word2&#xff0c; 请返回将 word1 转换成 word2 所使用的最少操作数 。 你可以对一个单词进行如下三种操作&#xff1a; 插入一个字符删除一个字符替换一个字符 示例 1&#xff1a; 输入&#xff1a;word1 "horse", word2 …

web安全学习笔记【17】——信息打点(7)

信息打点-APP资产&知识产权&应用监控&静态提取&动态抓包&动态调试 #知识点&#xff1a; 1、业务资产-应用类型分类 2、Web单域名获取-接口查询 3、Web子域名获取-解析枚举 4、Web架构资产-平台指纹识别 ------------------------------------ 1、开源-CMS指…

C# 通过共享内存调用C++ 算法

需求&#xff1a; C#程序调用 C开发的dll. 一种C# 程序调用c 算法方案_算法怎么被c#调用-CSDN博客 上回书说到&#xff0c;将c算法封装为dll 插件&#xff0c;c加载后&#xff0c;暴露C风格接口&#xff0c;然后供C#调用。但是这样有几个问题&#xff1a; 1&#xff0c;一是…

【编程语言之·调试输出打印技巧】

系列文章目录 文章目录 前言一、调试打印输出开关1.1宏定义应用 二、打印错误的函数2.1 perror()2.2 strerror() 三、示例总结 前言 一、调试打印输出开关 1.1宏定义应用 示例1&#xff1a; #define DEBUG_ON 0 #if DEBUG_ON #define DEBUG(...) qDebug(__VA_ARGS__) #else …

【Python笔记-设计模式】中介者模式

一、说明 中介者模式是一种行为设计模式&#xff0c;减少对象之间混乱无序的依赖关系。该模式会限制对象之间的直接交互&#xff0c;迫使它们通过一个中介者对象进行合作。 (一) 解决问题 降低系统中对象之间的直接通信&#xff0c;将复杂的交互转化为通过中介者进行的间接交…

RK3568平台开发系列讲解(Linux系统篇)SPI 客户端通信

🚀返回专栏总目录 文章目录 一、spi_transfer二、spi_message三、初始化沉淀、分享、成长,让自己和他人都能有所收获!😄 SPI I/O模型由一组队列消息组成。我们提交一个或多个struct spi_message结构时,这些结构以同步或异步方式处理完成。单个消息由一个或多个struct sp…

Basisformer时间序列预测 锂电池SOC估计

Basisformer是一种基于Transformer架构的模型&#xff0c;用时间序列预测任务。 【Basisformer】时间序列预测 【锂电池SOC估计】 [1]采用自适应监督自监督对比学习方法学习时序特征 [2]通过双向交叉注意力机制计算历史序列和基准序列之间的相关系数 [3]最后通过相关系数…

动态规划(算法竞赛、蓝桥杯)--深入浅出的完全背包DP

1、B站视频链接&#xff1a;E09【模板】背包DP 完全背包_哔哩哔哩_bilibili #include <bits/stdc.h> using namespace std; const int N1010; int n,m; int v[N],w[N],f[N][N];int main(){scanf("%d%d",&n,&m);for(int i1;i<n;i){scanf("%d%d…

人像背景分割SDK,智能图像处理

美摄科技人像背景分割SDK解决方案&#xff1a;引领企业步入智能图像处理新时代 随着科技的不断进步&#xff0c;图像处理技术已成为许多行业不可或缺的一部分。为了满足企业对于高质量、高效率人像背景分割的需求&#xff0c;美摄科技推出了一款领先的人像背景分割SDK&#xf…

一款实用的.NET Core加密解密工具类库

前言 在我们日常开发工作中&#xff0c;为了数据安全问题对数据加密、解密是必不可少的。加密方式有很多种如常见的AES&#xff0c;RSA&#xff0c;MD5&#xff0c;SAH1&#xff0c;SAH256&#xff0c;DES等&#xff0c;这时候假如我们有一个封装的对应加密解密工具类可以直接…

虚拟机JVM

虚拟机 1、定义jvm 假想计算机 运行在操作系统之上 和硬件之间没有直接交互 包括 一套字节码指令、寄存器、栈、垃圾回收、堆 一个存储方法域 jvm:承担一个翻译工作&#xff0c;动态的将java代码编译成操作系统可以识别的机器码。 从软件层面屏蔽了不同操作系统在底层硬件与指…

petalinux-config : command not found 和petalinux-build: command not found

发现这两个问题都是因为&#xff1a;没有先设置 petalinux 的作环境 先输入命令 先执行 source /opt/pkg/petalinux/2020.2/settings.sh 或者 sptl 然后切换目录&#xff0c;到相应的目录&#xff0c;就可以了