荣誉艾尔迪亚人的题解

目录

原题描述:

题目背景

题目描述

输入格式

输出格式

样例

Input 1

Output 1

Input 2

Output 2

数据范围:

样例解释

主要思路:

代码code:


原题描述:

时间限制: 1000ms

空间限制: 65536kb

题目背景


​ 艾尔迪亚人在与巨人的战斗中雷枪发挥了不可磨灭的作用,雷枪之所以能够发挥那么强的作用,是因为雷枪能够牢固的刺入巨人的身体内引爆。雷枪的核心威力来源自火药,而火药的原材料由硫磺、硝石与炭原材料制造而成的,而火药的原材料可以由矿洞产出。

题目描述


​小埋是一个艾尔迪亚矿工,挖矿对于小埋来说能获得财富和荣誉(因为要抗击巨人需要大量材料,艾尔迪亚高层要鼓励矿工们多采矿),荣誉值到达一定值可以成为荣誉艾尔迪亚人

​ 现在小埋挖矿既想获得一定的财富也想获得一定量的荣誉。假设我们已知小埋挖的那部分矿洞有 n 块矿石,并且已知这 n 块矿石的重量 a_1,a_2,...,a_n,对于每块矿石我们能够获得一些财富值和荣誉值,对于每块矿石的财富值和荣誉值设定如下。

  • 对于第i块矿石,它的财富值为前 i块矿石中以第 i 块矿石结尾的(非严格)递增序列长度最大值。(第i 块矿石为结尾矿石,就是必须选第i 块矿石为结尾)。
  • 对于第 i 块矿石,它的荣誉值为第 i 块到第 n 块矿石中以第 i  块矿石为起点的(非严格)递减序列长度最大值。(第i 块矿石为起点矿石,就是必须选第i 块矿石为起点)。

小埋想要在自己需要至少获得财富值为 m 荣誉值为 v的情况下,所挖出矿石总和的最小重量。

输入格式

​ 第一行输入一个整数 n ,表示矿石的数量。

​ 第二行 n 个整数a_1,a_2,...,a_n​ 分别表示每个矿石的重量。

​ 第三行输入m 和 v 表示我们需要至少获得的财富值和荣誉值。

输出格式

输出占一行,输出一个整数,表示​输出小埋能够在限定条件下,挖出矿石总和的最小重量。

样例

Input 1
5
1 2 2 3 5
5 5
Output 1
8
Input 2
5
1 2 3 2 1
3 4 
Output 2
3

数据范围:

对于所有测试数据有:0 \le n \le 10^5,0 \le m*v \le 10^3,1 \le a_i \le 10^9

样例解释

  • 对于样例1,我们可以选择前四个矿石[1,2,2,3]
    • 以第一个矿石为结尾的(非严格)递增序列为 [1],财富值为 1,以第一个矿石为开头的非严格递减序列为1,荣誉值为 1
    • 以第二个矿石为结尾的非严格递增序列为 [1,2],财富值为2,以第二个矿石为开头的非严格递减子序列为[2,2] ,荣誉值为 2
    • 以第三个矿石为结尾的非严格递增序列为 [1,2,2],财富值为3,以第三个矿石为开头的非严格递减子序列为[2] ,荣誉值为1
    • 以第四个矿石为结尾的非严格递增序列为[1,2,2,3],财富值为4,以第四个矿石为开头的非严格递减子序列为3,荣誉值为 1
    • 所以我们的财富值为 1+2+3+4 = 10,荣誉值为1+2+1+1 = 5,满足我们所需的至少获得财富值为 5,荣誉值为 5,并且所挖去的矿石总重量最小。
  • 对于样例2,我们可以选第二个矿石和第五个矿石,第二个矿石重量为 2,财富值为 2荣誉值为3,第五个矿石重量矿石重量为 1,财富值为 2,荣誉值为1,我们此时满足至少财富值3,且荣誉值为4 的情况,并且此时总重量最小为 3,或者我们也可以选择第一块矿石和第二块矿石。

主要思路:

很明显,是最长上升子序列问题+二维费用背包问题。

把第 i 块到第 n 块矿石中以第 i  块矿石为起点的(非严格)递减序列长度最大值。(第i 块矿石为起点矿石,就是必须选第i 块矿石为起点)这句话就理解成第i块矿石为结尾,第n块矿石为开头的最长上升子序列,接着后面就是二维费用背包。

但是最长上升子序列朴素版是O(n^2),这里会超时,所以得用二分优化成O(n \log_2^n)

代码code:

#include<bits/stdc++.h>
using namespace std;
long long tmp[100010],f[100010],f1[100010],a[100010];
long long n;
long long m,v;
long long dp[1010][1010];
int main()
{cin>>n;for(int i=1;i<=n;i++){cin>>a[i];}cin>>m>>v;long long pos=1;tmp[1] = a[1];f[1] = 1;for(int i=2;i<=n;i++){long long l=1,r=pos;while(l<r){long long mid = (l+r+1)/2;if(tmp[mid]<=a[i]){l = mid;}else{r = mid-1;}}if(tmp[l]>a[i]){tmp[l] = a[i];f[i] = l;}else{if(l == pos){tmp[++pos] = a[i];f[i] = pos;}else{tmp[l+1] = a[i];f[i] = l+1;}}}//此时,f[i]就代表已第i个为结尾,第一个为开头的最长上升子序列pos=1;tmp[1] = a[n];f1[n] = 1;for(int i=n-1;i>=1;i--){long long l=1,r=pos;while(l<r){long long mid = (l+r+1)/2;if(tmp[mid]<=a[i]){l = mid;}else{r = mid-1;}}if(tmp[l]>a[i]){tmp[l] = a[i];f1[i] = l;}else{if(l == pos){tmp[++pos] = a[i];f1[i] = pos;}else{tmp[l+1] = a[i];f1[i] = l+1;}}}//同理memset(dp,0x3f,sizeof(dp));//dp初始化dp[0][0] = 0;for(int i=1;i<=n;i++){for(int j=m;j>=0;j--){for(int k=v;k>=0;k--){dp[j][k] = min(dp[j][k],dp[max(j-f[i],0LL)][max(k-f1[i],0LL)]+a[i]);//二维费用背包}}}cout<<dp[m][v];return 0;
}

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

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

相关文章

接口自动化框架搭建-写在前面

从今天开始&#xff0c;我将带领大家一起学习接口自动化框架的搭建&#xff0c;在学习之前&#xff0c;我们先了解搭建一个接口自动化框架需要具备哪些知识&#xff0c;应该做哪些准备工作 测试开发工程师的入门条件 近几年比较流行测试开发岗位&#xff0c;很多小伙伴都不知…

VBA自学日志

文章目录 前言一、For each 循环二、offset 偏移三、Resize 属性四、Exit 语句五、DO...LOOP语句六、一些错误代码总结七、GOTO语句八、do while 和 do until九、如何在VBA内使用Excel工作表函数十、VBA使用随机数十一、排序总结 前言 VBA自学成柴的第三周 一、For each 循环 …

leetcode 454 四数之和

题目 给你四个整数数组 nums1、nums2、nums3 和 nums4 &#xff0c;数组长度都是 n &#xff0c;请你计算有多少个元组 (i, j, k, l) 能满足&#xff1a; 0 < i, j, k, l < n nums1[i] nums2[j] nums3[k] nums4[l] 0 示例 1&#xff1a; 输入&#xff1a;nums1 …

Arduino开发实例-INA219 电流传感器驱动

INA219 电流传感器驱动 文章目录 INA219 电流传感器驱动1、INA219 电流传感器介绍2、硬件准备及接线3、代码实现1、INA219 电流传感器介绍 INA219 模块用于同时测量电流和电压。 该模块使用 I2C 通信传输电压和电流数据。 其他特性: 测量精度:1%最大测量电压:26V最大测量电…

【高等数学之牛莱公式】

一、深入挖掘定积分 二、变限积分 三、变限积分的"天然"连续性 四、微积分基本定理 五、定积分基本方法 5.1、换元法 5.2、分部积分法 六、定积分经典结论 七、区间再现公式 八、三角函数积分变换公式 九、周期函数积分变换公式 十、分段函数求定积分

【C语言编程之旅 6】刷题篇-for循环

第1题 解析 思路&#xff1a; 两个循环进行控制 外层循环控制打印多少行 内部循环控制每行打印多少个表达式以及表达式内容&#xff0c; 比较简单&#xff0c;具体参考代码 #include <stdio.h> int main() {int i 0;//控制行数for(i1; i<9; i){//打印每一行内容&am…

mac 中vscode设置root启动

1. 找到你的vscode app&#xff0c;点击鼠标右键------->选项----->在访达中显示 2. 终端中输入以下命令&#xff0c;不要点回车&#xff0c;不要点回车&#xff0c;输入一个空格 sudo chflags uchg 3. 然后将你的程序拖到终端&#xff0c;会自动…

编译openjdk 调试java

背景 一直很想深入了解java运行机制&#xff0c;想编译debug版本openjdk 实践 安装环境 安装vmware软件&#xff0c;第一步就遇到很多麻烦&#xff0c;找不到免费的vmware。 后来下载了官网的&#xff0c;在github和百度一直搜如何破解&#xff0c;幸亏有大佬传了比较全的…

Peter算法小课堂—拓扑排序与最小生成树

拓扑排序 讲拓扑排序前&#xff0c;我们要先了解什么是DAG树。所谓DAG树&#xff0c;就是指“有向无环图”。请判断下列图是否是DAG图 第一幅图&#xff0c;它不是DAG图&#xff0c;因为它形成了一个环。第二幅图&#xff0c;它也不是DAG图&#xff0c;因为它没有方向。第三幅…

Docker Consul详解与部署示例

目录 Consul构成 Docker Consul 概述 Raft算法 服务注册与发现 健康检查 Key/Value存储 多数据中心 部署模式 consul-template守护进程 registrator容器 consul服务部署&#xff08;192.168.41.31&#xff09; 环境准备 搭建Consul服务 查看集群信息 registrato…

触摸屏监控双速电动机-确定地址分配

I/O地址分配 当选择了PLC之后&#xff0c;首先需要确定的是系统中各I/O点的绝对地址。在某些PLC 中1/O绝对地址的分配方式共有固定地址型、自动分配型、用户定义型3种。实际所使用的方式取决于所采用的PLC的CPU型号、编程软件、软件版本、编程人员的选择等因素。 本任务输入信…

vulnhub-dc2靶场

DC2 配置环境vmware17 nat网络配置 下载地址:DC and Five86 Series Challenges - DC-1 &#xff08;似乎从2024/1/18左右找不到这个资源了&#xff09; 攻击机kali与其在同一网段下 ip:192.168.52.130 信息收集 arp-scan -l #内网探测&#xff0c;扫描目标ip发现目标ip1…