枚举 B. Lorry

Problem - B - Codeforces

题目大意:给物品数量 n n n,体积为 v ( 0 ≤ v ≤ 1 e 9 ) v_{(0 \le v \le 1e9)} v(0v1e9),第一行读入 n , v n, v n,v,之后 n n n行,读入 n n n个物品,之后每行依次是体积和价值,其中体积要么是1要么是2。要求输出价值和最大,且依次输出所选物品的编号。

思路:发现,体积 v v v很大,用01背包一定不行,01背包优化的事件复杂度是 O ( v ) O(v) O(v),也过不去。但是发现物品的体积要么是1要么是2。我们可以将物品按其体积分为两类,分别表示体积为1的物品和体积为2的物品。之后对于相同体积的物品来说,我们优先考虑其价值最大的那个,所以要对物品进行排序。之后枚举物品体积为1的数量 i i i,得到在物品体积为1的数量 i i i的条件下,得到的最大值,不断的进行更新即可。

代码如下:

void solve() {int n,V; cin>>n>>V;// [0, 0] -> 物品价值,物品编号vector<array<int,2>> t1, t2;t1.push_back({0, 0});t2.push_back({0, 0});for(int i = 0; i < n; ++i) {int v, w; cin>>v>>w;if(v == 1) t1.push_back({w, i + 1});else t2.push_back({w, i + 1});}// 得到物品体积为1的数量,和2的数量int len1 = t1.size() - 1, len2 = t2.size() - 1;// 对物品按照价值从大到小进行排序sort(t1.begin() + 1, t1.end(), [&](auto pre, auto suf) {return pre[0] > suf[0];});sort(t2.begin() + 1, t2.end(), [&](auto pre, auto suf) {return pre[0] > suf[0];});// 得到体积为2的物品的前缀和vector<int> pre(len2 + 1);for(int i = 1; i <= len2; ++i) {pre[i] = pre[i - 1] + t2[i][0];}// 最大值,当前体积为1的物品之和int ma = 0, sum = 0;// 最大值时体积为的个数和体积为2的个数int ans1 = 0, ans2 = 0;// 枚举体积为1的数量,得到最大值for(int i = 0; i <= len1; ++i) {if(i > V) break;int j = min( (V - i) / 2, len2);sum += t1[i][0];if(sum + pre[j] > ma) {ma = sum + pre[j];ans1 = i; ans2 = j;}}// 输出即可cout<<ma<<'\n';for(int i = 1; i <= ans1; ++i) cout<<t1[i][1]<<' ';for(int i = 1; i <= ans2; ++i) cout<<t2[i][1]<<' ';
}

刚开始写的时候,发现定义比较麻烦,就用了map进行映射,发现要处理边界问题,还不如上面简介呢(

void solve() {int n,v; cin>>n>>v;map<int, vector<array<int,2>> > mp;for(int i = 0; i < n; ++i) {int v,w; cin>>v>>w;mp[v].push_back({w, i + 1});}for(int i = 1; i < 3; ++i) {sort(all(mp[i]), [&](auto pre, auto suf) {return pre[0] > suf[0];});}int vlen2 = mp[2].size();vector<int> pre(vlen2 + 1);auto v2(mp[2]);for(int i = 0; i < vlen2; ++i) {pre[i + 1] = pre[i] + v2[i][0];}int sum = 0, ma = 0, need1 = 0, need2 = 0;auto v1(mp[1]);int vlen1 = n - vlen2;ma = pre[min(v / 2, vlen2)]; need2 = min(v / 2, vlen2);for(int i = 1; i <= vlen1; ++i) {if(i > v) break;sum += v1[i-1][0];int j = min( (v - i) / 2, vlen2);if(sum + pre[j] >  ma) {ma = sum + pre[j];need1 = i; need2 = j;}}cout<<ma<<'\n';for(int i = 0; i < need1; ++i) {cout<<v1[i][1]<<' ';}for(int i = 0; i < need2; ++i) {cout<<v2[i][1]<<' ';}
}

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

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

相关文章

易错知识点(数学一)

一、反常积分判敛 1、构造使其极限等于一个大于0的常数 1&#xff09;前者通过&#xff1a;化等价无穷小 or 泰勒展开 2&#xff09;若存在p>1使得等式成立&#xff0c;则收敛 考察形式&#xff1a;1、已知收敛&#xff0c;求f(x)中的幂次取值范围 主要思想&#xff1a;比较…

⑧【HyperLoglog】Redis数据类型:HyperLoglog [使用手册]

个人简介&#xff1a;Java领域新星创作者&#xff1b;阿里云技术博主、星级博主、专家博主&#xff1b;正在Java学习的路上摸爬滚打&#xff0c;记录学习的过程~ 个人主页&#xff1a;.29.的博客 学习社区&#xff1a;进去逛一逛~ Redis HyperLoglog ⑧Redis HyperLoglog基本操…

基于SpringBoot+Redis的前后端分离外卖项目-苍穹外卖(七)

分页查询、删除和修改菜品 1. 菜品分页查询1.1 需求分析和设计1.1.1 产品原型1.1.2 接口设计 1.2 代码开发1.2.1 设计DTO类1.2.2 设计VO类1.2.3 Controller层1.2.4 Service层接口1.2.5 Service层实现类1.2.6 Mapper层 1.3 功能测试1.3.2 前后端联调测试 2. 删除菜品2.1 需求分析…

使用 HTML、CSS 和 JavaScript 创建图像滑块

使用 HTML、CSS 和 JavaScript 创建轮播图 在本文中&#xff0c;我们将讨论如何使用 HTML、CSS 和 JavaScript 构建轮播图。我们将演示两种不同的创建滑块的方法&#xff0c;一种是基于opacity的滑块&#xff0c;另一种是基于transform的。 创建 HTML 我们首先从 HTML 代码开…

Linux系统的研究

摘要&#xff1a; Linux是一个开源的Unix-like操作系统&#xff0c;由林纳斯托瓦兹在1991年首次发布。由于其开放性和灵活性&#xff0c;Linux已成为许多企业和个人用户的重要选择。本文将探讨Linux系统的历史、特点、应用领域以及优缺点。 一、引言 Linux系统的开发始于1980年…

yolo系列中的一些评价指标说明

文章目录 一. 混淆矩阵二. 准确度(Accuracy)三. 精确度(Precision)四. 召回率(Recall)五. F1-score六. P-R曲线七. AP八. mAP九. mAP0.5十. mAP[0.5:0.95] 一. 混淆矩阵 TP (True positives)&#xff1a;被正确地划分为正例的个数&#xff0c;即实际为正例且被分类器划分为正例…

Redis-主从与哨兵架构

Jedis使用 Jedis连接代码示例&#xff1a; 1、引入依赖 <dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>2.9.0</version> </dependency> 2、访问代码 public class JedisSingleTe…

JVM虚拟机:JVM调优第一步,了解JVM常用命令行参数

本文重点 从本文课程开始&#xff0c;我们将用几篇文章来介绍JVM中常用的命令行的参数&#xff0c;这个非常重要&#xff0c;第一我们可以通过参数了解JVM的配置&#xff0c;第二我们可以通过参数完成对JVM的调参。以及后面的JVM的调优也需要用到这些参数&#xff0c;所以我们…

轻松入门自然语言处理系列 项目3 基于Linear-CRF的医疗实体识别

文章目录 前言一、项目概况1.项目描述2.数据描述3.项目框架二、核心技术1.实体识别数据标注2.文本特征工程3.CRF模型4.BiLSTM-CRF模型三、项目实施1.读取数据2.数据标注3.文本特征工程4.模型训练5.模型评估6.BiLSTM-CRF总结前言 本文主要介绍了以Linear-CRF为基础模型进行医疗…

App 设计工具

目录 说明 打开 App 设计工具 示例 创建 App 创建自定义 UI 组件 打开现有 App 文件 打包和共享 App 本文主要讲述以交互方式创建 App。 说明 App 设计工具是一个交互式开发环境&#xff0c;用于设计 App 布局并对其行为进行编程。 可以使用 App 设计工具&#xff1a…

【黑马甄选离线数仓day05_核销主题域开发】

1. 指标分类 ​ 通过沟通调研&#xff0c;把需求进行分析、抽象和总结&#xff0c;整理成指标列表。指标有原子指标、派生指标、 衍生指标三种类型。 ​ 原子指标基于某一业务过程的度量值&#xff0c;是业务定义中不可再拆解的指标&#xff0c;原子指标的核心功能就是对指标…

Python武器库开发-前端篇之CSS元素(三十二)

前端篇之CSS元素(三十二) CSS 元素是一个网页中的 HTML 元素&#xff0c;包括标签、类和 ID。它们可以通过 CSS 选择器选中并设置样式属性&#xff0c;以使网页呈现具有吸引力和良好的可读性。常见的 HTML 元素包括 div、p、h1、h2、span 等&#xff0c;它们可以使用 CSS 设置…

值得看的书--《全宋词》节选

(https://img-blog.csdnimg.cn/5d5fe2844f6646b5b7b415f0a9e80f6c.jpg)

什么是自动化测试po模式,po分层如何实现?

一、什么是PO模式 全称&#xff1a;page object model 简称&#xff1a;POM/PO PO模式最核心的思想是分层&#xff0c;实现松耦合&#xff01;实现脚本重复使用&#xff0c;实现脚本易维护性&#xff01; 主要分三层&#xff1a; 1.基础层BasePage&#xff1a;封装一些最基…

自监督LIGHTLY SSL教程

Lightly SSL 是一个用于自监督学习的计算机视觉框架。 github链接&#xff1a;GitHub - lightly-ai/lightly: A python library for self-supervised learning on images. Documentation&#xff1a;Documentation — lightly 1.4.20 documentation 以下内容主要来自Documen…

作为Java初学者,如何快速学好Java?

作为Java初学者&#xff0c;如何快速学好Java&#xff1f; 开始的一些话 对于初学者来说&#xff0c;编程的学习曲线可能相对陡峭。这是正常现象&#xff0c;不要感到沮丧。逐步学习&#xff0c;循序渐进。 编程是一门实践性的技能&#xff0c;多写代码是提高的唯一途径。尽量…

C++中std::string的=,+,+=使用过程中的问题

1. 调用构造函数时的运算符不支持int&#xff0c;char类型的操作数 string str1 a; //error 这是一个构造函数。C中string是一个类&#xff0c;内部封装了char *来管理这个字符串。 string的构造函数&#xff1a; string() // 创建一个空的字符串string(const char * s)…

C++初阶(十二)string的模拟实现

&#x1f4d8;北尘_&#xff1a;个人主页 &#x1f30e;个人专栏:《Linux操作系统》《经典算法试题 》《C》 《数据结构与算法》 ☀️走在路上&#xff0c;不忘来时的初心 文章目录 一、string类的模拟实现1、构造、拷贝构造、赋值运算符重载以及析构函数2、迭代器类3、增删查…

GlobalWindow和Evictor的常用组合使用

背景 在平时的flink开发中&#xff0c;一旦我们使用到GlobalWindow&#xff0c;那么肯定也就意味着会搭配Evictor以及Tigger一起使用&#xff0c;只有这样才能触发窗口处理函数并且窗口内的元素数量限定在特定的范围内 GlobalWindow和Evictor常见组合用法 先看一下具体的搭配…

【linux】基本指令(中篇)

echo指令 将引号内容打印到显示屏上 输出的重定向 追加的重定向 输出的重定向 我们学习c语言的时候当以写的方式创建一个文件&#xff0c;就会覆盖掉该文件之前的内容 当我们以追加的方式打开文件的时候&#xff0c;原文件内容不会被覆盖而是追加 more指令 10.more指令…