当前位置: 首页 > news >正文

第十三届蓝桥杯国赛 C++ B 组 J 题——搬砖(AC)

目录

  • 1.搬砖
    • 1.题目描述
    • 2.输入格式
    • 3.输出格式
    • 4.样例输入
    • 5.样例输出
    • 6.数据范围
  • 7.原题链接
  • 2.解题思路
  • 3.Ac_code

1.搬砖

1.题目描述

这天,小明在搬砖。

他一共有 nnn 块砖, 他发现第 iii 砖的重量为 wiw_{i}wi, 价值为 viv_{i}vi 。他突然想从这些 砖中选一些出来从下到上堆成一座塔, 并且对于塔中的每一块砖来说, 它上面 所有砖的重量和不能超过它自身的价值。

他想知道这样堆成的塔的总价值(即塔中所有砖块的价值和)最大是多少。

2.输入格式

输入共 n+1n+1n+1 行, 第一行为一个正整数 nnn, 表示砖块的数量。后面 nnn 行, 每行两个正整数 wi,viw_i ,v_iwi,vi
分别表示每块砖的重量和价值。

3.输出格式

一行, 一个整数表示答案。

4.样例输入

5
4 4
1 1
5 2
5 5
4 3

5.样例输出

10

6.数据范围

n≤1000;wi≤20;vi≤20000。n≤1000;w_i ≤20;v_i ≤20000 。n1000;wi20;vi20000

7.原题链接

搬砖

2.解题思路

诸如此题的模型,思路都是按照一种方式排序,使得最优解答案的选择情况,是排序后的一个子序列,然后直接进行背包 dpdpdp 即可。

那么该如何去寻找排序的条件呢?一般的思路在于,对于砖块 xxxyyy,如果排序后的结果 yyyxxx的后面,那么对于任意 yyyxxx 之上的摆放情况,都一定可以将两者调换。
在这里插入图片描述
如图,红色砖块为 yyy 上所有砖块的重量,我们设为 w1w_1w1,绿色为 xxxyyy 之间的砖块重量,我们设为 w2w_2w2
根据题意可知:vy≥w1,vx≥w1+wy+w2v_y≥ w_1,v_x≥w_1+w_y+w_2vyw1vxw1+wy+w21
假设排序后 yyyxxx 的后面,那么也一定满足:vx≥w1,vy≥w1+wx+w2v_x≥ w_1,v_y≥w_1+w_x+w_2vxw1vyw1+wx+w22

因为vx≥w1+wy+w2v_x≥w_1+w_y+w_2vxw1+wy+w21wy+w2w_y+w_2wy+w2一定大于 000,显然vx≥w1v_x≥ w_1vxw1是一定符合要求的。

然后考虑第二个式子,因为 vx≥w1+wy+w2v_x≥w_1+w_y+w_2vxw1+wy+w21,经过变形可得 vx−wy≥w1+w2v_x-w_y≥w_1+w_2vxwyw1+w23
将式子3带入式子2可得:
vy≥wx+vx−wyv_y≥w_x+v_x-w_yvywx+vxwy
将式子整理可得:
vy+wy≥wx+vxv_y+w_y≥w_x+v_xvy+wywx+vx
由此,我们找到了排序条件,也就是说,当满足 vy+wy≥wx+vxv_y+w_y≥w_x+v_xvy+wywx+vx 时,任意 yyyxxx 之上的摆放情况,都一定可以将两者调换

接下来就是进行背包 dpdpdp即可,
定义 f[i][j]f[i][j]f[i][j]为只考虑前 iii 个物品,且选择的重量为 jjj 的最大价值。考虑如何进行转移,对于背包问题,无非是选与不选的两种抉择:

f[i][j]={f[i−1][j]不可选max(f[i−1][j],f[i−1][j−w]+v)if j≥w且v≥j-w可选f[i][j] = \begin{cases} f[i-1][j] &不可选\\ max(f[i-1][j],f[i-1][j-w]+v) &\text{if j≥w且v≥j-w} 可选\\ \end{cases}f[i][j]={f[i1][j]max(f[i1][j],f[i1][jw]+v)不可选if j≥wv≥j-w可选

题目体积最大只有2e4,答案即为从f[n][0]f[n][0]f[n][0]f[n][20000]f[n][20000]f[n][20000]取个最大值。由于是01背包问题,可以使用滚动数组进行优化。

时间复杂度:O(nlogn+nV)O(nlogn+nV)O(nlogn+nV)

3.Ac_code

未优化版本:

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef unsigned long long uLL;
typedef pair<int, int> PII;
#define pb(s) push_back(s);
#define SZ(s) ((int)s.size());
#define ms(s,x) memset(s, x, sizeof(s))
#define all(s) s.begin(),s.end()
const int inf = 0x3f3f3f3f;
const int mod = 1000000007;
const int N = 1010;int n;
//只考虑前 i 个砖块,且重量为 j 的最大价值
int f[N][N * 20];
PII a[N];
bool cmp(PII b, PII c) {return b.first + b.second < c.first + c.second;
}
void solve()
{cin >> n;for (int i = 1; i <= n; ++i) {cin >> a[i].first >> a[i].second;}sort(a + 1, a + n + 1, cmp);for (int i = 1; i <= n; ++i) {int w = a[i].first, v = a[i].second;for (int j = 0; j <= 20000; ++j) {f[i][j] = f[i - 1][j];//可选情况if (w <= j && v >= j - w) f[i][j] = max(f[i][j], f[i - 1][j - w] + v);}}int ans=0;for(int i=0;i<=20000;++i) ans=max(ans,f[n][i]);cout << ans << '\n';
}
int main()
{ios_base :: sync_with_stdio(false);cin.tie(0); cout.tie(0);int t = 1;while (t--){solve();}return 0;
}

滚动数组优化:

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef unsigned long long uLL;
typedef pair<int, int> PII;
#define pb(s) push_back(s);
#define SZ(s) ((int)s.size());
#define ms(s,x) memset(s, x, sizeof(s))
#define all(s) s.begin(),s.end()
const int inf = 0x3f3f3f3f;
const int mod = 1000000007;
const int N = 1010;int n;
//只考虑前 i 个砖块,且重量为 j 的最大价值
int f[N * 20];
PII a[N];
bool cmp(PII b, PII c) {return b.first + b.second < c.first + c.second;
}
void solve()
{cin >> n;for (int i = 1; i <= n; ++i) {cin >> a[i].first >> a[i].second;}sort(a + 1, a + n + 1, cmp);for (int i = 1; i <= n; ++i) {int w = a[i].first, v = a[i].second;for (int j = 20000; j >= w; --j) {//可选情况if ( v >= j - w) f[j] = max(f[j], f[j - w] + v);}}int ans = 0;for (int i = 0; i <= 20000; ++i) ans = max(ans, f[i]);cout << ans << '\n';
}
int main()
{ios_base :: sync_with_stdio(false);cin.tie(0); cout.tie(0);int t = 1;while (t--){solve();}return 0;
}

相关文章:

第十三届蓝桥杯国赛 C++ B 组 J 题——搬砖(AC)

目录1.搬砖1.题目描述2.输入格式3.输出格式4.样例输入5.样例输出6.数据范围7.原题链接2.解题思路3.Ac_code1.搬砖 1.题目描述 这天&#xff0c;小明在搬砖。 他一共有 nnn 块砖, 他发现第 iii 砖的重量为 wiw_{i}wi​, 价值为 viv_{i}vi​ 。他突然想从这些 砖中选一些出来从…...

Spring Cloud Nacos源码讲解(十)- Nacos服务端服务发现处理

Nacos集群数据同步 ​ 当我们有服务进行注册以后&#xff0c;会写入注册信息同时会触发ClientChangedEvent事件&#xff0c;通过这个事件&#xff0c;就会开始进行Nacos的集群数据同步&#xff0c;当然这其中只有有一个Nacos节点来处理对应的客户端请求&#xff0c;其实这其中…...

C++ 修改程序进程的优先级(Linux,Windows)

文章目录1、Linux1.1 常用命令1.1.1 不占用终端运行和后台运行方式1.1.2 查询进程1.1.3 结束进程1.1.4 优先级命令1.2 C 代码示例1.2.1 代码一1.2.2 代码二2、Windows2.1 简介2.2 函数声明2.3 C 代码示例2.3.1 代码一2.3.2 代码二结语1、Linux 1.1 常用命令 1.1.1 不占用终端…...

同步和异步promise

进程和线程进程&#xff08;厂房&#xff09;&#xff1a;程序的运行环境线程&#xff08;工人&#xff09;&#xff1a;进行运算的东西同步和异步同步&#xff1a;一件事干完才去干下一件事&#xff0c;前面的代码不执行&#xff0c;后面的代码也不执行。同步的代码可能会出现…...

CHATGPT是新的“搜索引擎终结者”吗?百度是否慌了

ChatGPT 以其非凡的自然语言处理 &#xff08;NLP&#xff09; 能力和清晰的响应风靡全球&#xff0c;有望带来一场重大的技术革命。在不知不觉中&#xff0c;叙事转向了ChatGPT与百度的对决&#xff0c;因为来自OpenAI的智能和健谈的聊天机器人已经慢慢获得了“潜在的百度终结…...

力扣-订单最多的客户

大家好&#xff0c;我是空空star&#xff0c;本篇带大家了解一道简单的力扣sql练习题。 文章目录前言一、题目&#xff1a;586. 订单最多的客户二、解题1.正确示范①提交SQL运行结果2.正确示范②提交SQL运行结果3.正确示范③提交SQL运行结果4.正确示范④提交SQL运行结果5.其他总…...

MyBatis学习笔记(六) —— MyBatis的各种查询功能

6、MyBatis的各种查询功能 6.1、查询一个实体类对象 SelectMapper.java接口 /*** 根据用户id查询用户信息* param id* return*/ User getUserById(Param("id") int id);SelectMapper.xml <!--User getUserById(Param("id") int id)--> <selec…...

2023年最新详细教程!手把手教你搭建Hexo + GitLab个人博客

文章目录前言一、安装和配置环境1.安装 Git2.安装 Node.js二、新建博客项目1.GitLab配置CI/CD自动化部署1.1 GitLab新建项目1.2 GitLab自建Runners1.2.1 下载gitlab-runner1.2.2 注册Runners1.2.3 安装Runners并启动1.3 添加.gitlab-ci.yml文件2.拉取和推送hexo blog2.1 拉取he…...

centos7安装

centos7安装制作U盘启动盘下载镜像下载 UltralISO制作启动盘使用U盘安装系统修改模式为 UEFI调整BOOT option保存重启进入安装界面安装图形界面安装搜狗输入法制作U盘启动盘 下载镜像 去官网下载镜像&#xff0c;找到 mirrors链接&#xff08;速度快&#xff09; 选择一个中…...

java String类(超详细,含常用方法、面试题,内存图,案例)

String类一、String类的特点二、String 类的常见构造方法三、String常见的面试题1.字符串常量池2.String s "abc"与String s new String("abc")区别3.字符拼接4.常量优化机制四、String常用方法1. 比较字符串内容2. 遍历字符串3.截取字符串4.替换字符串5…...

哈希表以及哈希冲突

目录 哈希表 哈希冲突 1. 冲突发生 2. 比较常见的哈希函数 3. 负载因子调节(重点) 散列表的载荷因子概念 负载因子和冲突率的关系 冲突-解决-闭散列 线性探测 二次探测 冲突-解决-开散列 结尾 我们在前面讲解了TerrMap&#xff08;Set&#xff09;的底层是一个搜索…...

测试——基本概念

概念 测试和调试有以下几点区别&#xff1a; 测试是测试人员进行的工作&#xff0c;调试是开发人员调试是发现并解决问题&#xff0c;测试只是发现问题测试贯穿于整个项目的生命周期&#xff0c;而调试主要在编码阶段 测试人员一般有如下的工作&#xff1a; 需求分析&#x…...

SnowFlake 雪花算法和原理(分布式 id 生成算法)

一、概述 SnowFlake 算法&#xff1a;是 Twitter 开源的分布式 id 生成算法。核心思想&#xff1a;使用一个 64 bit 的 long 型的数字作为全局唯一 id。算法原理最高位是符号位&#xff0c;始终为0&#xff0c;不可用。41位的时间序列&#xff0c;精确到毫秒级&#xff0c;41位…...

【死磕数据库专栏】MySQL对数据库增删改查的基本操作

前言 本文是专栏【死磕数据库专栏】的第二篇文章&#xff0c;主要讲解MySQL语句最常用的增删改查操作。我一直觉得这个世界就是个程序&#xff0c;每天都在执行增删改查。 MySQL 中我们最常用的增删改查&#xff0c;对应SQL语句就是 insert 、delete、update、select&#xf…...

阿里软件测试二面:adb 连接 Android 手机的两种方式,看完你就懂了

前言 随着现在移动端技术的突飞猛进&#xff0c;导致现在市场上&#xff0c;APP 应用数不胜数&#xff0c;那对于测试工程师而言&#xff0c;对于 APP 的测试&#xff0c;那基本就是一个必修课了。 今天&#xff0c;我就来给大家介绍一下&#xff0c;adb 连接 Android 手机的两…...

Docker安装YApi

目录0、Docker 环境准备1、数据库准备 MongoDB2、启动 YAPI3、官网教程0、Docker 环境准备 Docker 容器之间网络互通需要使用 docker network create yapi 创建一个自定义网络 docker network create yapi1、数据库准备 MongoDB YAPI 的数据库是 MongoDB&#xff0c;准备镜像…...

springboot自定义参数解析器

为什么要自定义参数解析器呢&#xff1f; 因为很多项目每次获取用户信息&#xff0c;需要重复从请求头中获取token&#xff0c;用token再去redis或是sql中去拿到存储的计本对象&#xff0c;再将获取到的Json数据&#xff0c;转化为我们需要的对象等代码&#xff0c;作为一名程…...

Python Unittest ddt数据驱动

1、数据驱动介绍&#xff1a; ddt.ddt&#xff08;类装饰器&#xff0c;申明当前类使用ddt框架&#xff09;ddt.data&#xff08;函数装饰器&#xff0c;用于给测试用例传递数据&#xff09;&#xff0c;支持传python所有数据类型&#xff1a;数字&#xff08;int&#xff0c;…...

Vue自定义组件遇到分页传输数据不正确解决办法

测试环境 Vue3 Element Plus 遇到问题 <el-table:data"tableData">...其他el-table-column<template #default"scope">// 自定义组件<my-button name"编辑" :id"scope.row.id"/ ></template></el-table&…...

ABAP 辨析CO|CN|CA|NA|CS|NS|CP|NP

1、文档说明 本篇文档将通过举例&#xff0c;解析字符的比较运算符之间的用法和区别&#xff0c;涉及到的操作符&#xff1a;CO|CN|CA|NA|CS|NS|CP|NP 2、用法和区别 用法总览 以下举例&#xff0c;几乎都使用一个字符变量和一个硬编码字符进行对比的方式&#xff0c;忽略尾…...

C++:std::is_convertible

C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...

大型活动交通拥堵治理的视觉算法应用

大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动&#xff08;如演唱会、马拉松赛事、高考中考等&#xff09;期间&#xff0c;城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例&#xff0c;暖城商圈曾因观众集中离场导致周边…...

UDP(Echoserver)

网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法&#xff1a;netstat [选项] 功能&#xff1a;查看网络状态 常用选项&#xff1a; n 拒绝显示别名&#…...

HTML 列表、表格、表单

1 列表标签 作用&#xff1a;布局内容排列整齐的区域 列表分类&#xff1a;无序列表、有序列表、定义列表。 例如&#xff1a; 1.1 无序列表 标签&#xff1a;ul 嵌套 li&#xff0c;ul是无序列表&#xff0c;li是列表条目。 注意事项&#xff1a; ul 标签里面只能包裹 li…...

大语言模型如何处理长文本?常用文本分割技术详解

为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...

Linux 中如何提取压缩文件 ?

Linux 是一种流行的开源操作系统&#xff0c;它提供了许多工具来管理、压缩和解压缩文件。压缩文件有助于节省存储空间&#xff0c;使数据传输更快。本指南将向您展示如何在 Linux 中提取不同类型的压缩文件。 1. Unpacking ZIP Files ZIP 文件是非常常见的&#xff0c;要在 …...

深度学习之模型压缩三驾马车:模型剪枝、模型量化、知识蒸馏

一、引言 在深度学习中&#xff0c;我们训练出的神经网络往往非常庞大&#xff08;比如像 ResNet、YOLOv8、Vision Transformer&#xff09;&#xff0c;虽然精度很高&#xff0c;但“太重”了&#xff0c;运行起来很慢&#xff0c;占用内存大&#xff0c;不适合部署到手机、摄…...

十九、【用户管理与权限 - 篇一】后端基础:用户列表与角色模型的初步构建

【用户管理与权限 - 篇一】后端基础:用户列表与角色模型的初步构建 前言准备工作第一部分:回顾 Django 内置的 `User` 模型第二部分:设计并创建 `Role` 和 `UserProfile` 模型第三部分:创建 Serializers第四部分:创建 ViewSets第五部分:注册 API 路由第六部分:后端初步测…...

【Ftrace 专栏】Ftrace 参考博文

ftrace、perf、bcc、bpftrace、ply、simple_perf的使用Ftrace 基本用法Linux 利用 ftrace 分析内核调用如何利用ftrace精确跟踪特定进程调度信息使用 ftrace 进行追踪延迟Linux-培训笔记-ftracehttps://www.kernel.org/doc/html/v4.18/trace/events.htmlhttps://blog.csdn.net/…...

ZYNQ学习记录FPGA(二)Verilog语言

一、Verilog简介 1.1 HDL&#xff08;Hardware Description language&#xff09; 在解释HDL之前&#xff0c;先来了解一下数字系统设计的流程&#xff1a;逻辑设计 -> 电路实现 -> 系统验证。 逻辑设计又称前端&#xff0c;在这个过程中就需要用到HDL&#xff0c;正文…...