二分答案 + P8800 [蓝桥杯 2022 国 B] 卡牌 - 题解

news2025/4/3 6:19:39

题解:卡牌问题

题目传送门:P8800 [蓝桥杯 2022 国 B] 卡牌

一、题目描述

小明有n种卡牌,每种卡牌有a_i张。他可以用m张空白牌制作任意卡牌,但第i种卡牌最多只能制作b_i张。问最多能凑出多少套"完整卡牌"(每套包含每种卡牌各一张)。

二、题目分析

这是一个典型的二分答案问题。我们需要找到最大的套数x,使得我们可以通过使用空白牌,让每种卡牌的数量都至少达到x张,且使用的空白牌总数不超过m张。

三、解题思路

  1. 二分搜索:我们可以在可能的套数范围内进行二分搜索,检查某个套数x是否可行。
  2. 可行性检查:对于每个候选的x,计算每种卡牌需要补充的数量(x - a_i),但要不超过b_i的限制,且总和不超过m。

四、算法讲解

算法采用二分答案策略:

  1. 排序:虽然题目没有明确要求,但将卡牌按现有数量排序可能有助于优化(但原代码中排序实际上不影响最终结果)。
  2. 二分框架:在可能的套数范围[0, max_a + m]内进行二分搜索。
  3. 检查函数:对于中间值mid,计算将所有卡牌补充到至少mid张所需空白牌数,检查是否满足条件。

以样例为例:

  • 输入:n=4, m=5, a=[1,2,3,4], b=[5,5,5,5]
  • 检查x=3:
    • 需要补充:2(1→3),1(2→3),0(3→3),0(4→3)
    • 总空白牌使用=3 ≤ 5,且每个补充不超过b_i限制
  • 检查x=4:
    • 需要补充:3(1→4),2(2→4),1(3→4),0(4→4)
    • 总空白牌使用=6 > 5,不可行
  • 因此最大可行套数是3

五、代码实现

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 2e5 + 10;
int n, m;
struct node {
    int a, b;
} arr[N];

// 排序函数,按现有卡牌数量升序排列
bool cmp(node c, node d) {
    return c.a < d.a;
}

// 检查是否能凑出x套牌
bool check(int x) {
    int cnt = 0;
    for (int i = 1; i <= n; i++) {
        int tem = x - arr[i].a;
        if (tem < 0)  // 现有牌已足够,不需要补充
            continue;
        else if (tem > arr[i].b)  // 需要补充的数量超过b_i限制
            return false;
        else {
            cnt += tem;  // 累加需要的空白牌数量
        }
    }
    return cnt <= m;  // 总空白牌使用量不超过m
}

void solve() {
    cin >> n >> m;
    for (int i = 1; i <= n; i++)
        cin >> arr[i].a;
    for (int i = 1; i <= n; i++)
        cin >> arr[i].b;
    sort(arr + 1, arr + 1 + n, cmp);  // 按现有数量排序
    
    // 二分查找最大可行套数
    int l = -1, r = 1e6;  // 初始范围设置
    while (l + 1 != r) {
        int mid = l + r >> 1;
        if (check(mid))
            l = mid;
        else
            r = mid;
    }
    cout << l;
}

signed main() {
    ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
    solve();
    return 0;
}

六、重点细节

  1. 二分边界:初始左边界设为-1,右边界设为1e6,确保覆盖所有可能情况。
  2. 检查函数:必须同时满足两个条件:(1)每种卡牌补充不超过b_i限制;(2)总补充数不超过m。
  3. 排序:虽然排序不是必须的,但可能在某些优化策略中有用(尽管原代码中并未利用排序特性)。

七、复杂度分析

  1. 时间复杂度:O(n log(max_answer)),其中二分次数为log(max_answer),每次检查需要O(n)时间。
  2. 空间复杂度:O(n),用于存储卡牌信息。

八、总结

本题通过二分答案的方法高效地解决了最大套数问题。关键在于设计合理的检查函数来判断某个套数是否可行。算法的时间复杂度能够很好地处理题目给出的数据规模限制(n ≤ 2×10^5)。

这种二分答案的思路在解决"最大化最小值"或"最小化最大值"类问题时非常有效,是算法竞赛中的重要技巧。

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

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

相关文章

Python----计算机视觉处理(Opencv:道路检测之道路透视变换)

一、透视变换 对于道路检测来说&#xff0c;为了方便车辆进行行驶&#xff0c;道路上都有车道线&#xff0c;为了更加方便对道路线进行检测&#xff0c;首先我们要把到路线平视图转变为俯视图&#xff0c;以便后期处理更加方便&#xff0c;如下图所示&#xff0c;该为虚拟场景的…

为什么 ThreadLocalMap 的 key 是弱引用 value是强引用

问题一&#xff1a;为什么 ThreadLocalMap 的 key 是弱引用&#xff1f; 【假设 Entry 的 key 是对 ThreadLocal 对象的强引用】&#xff1a;这个 Entry 又持有 ThreadLocal 对象和 value 对象的强引用。如果在其他地方都没有对这个 ThreadLocla 对象的引用了、然后在使用 Thr…

AI 能解开内容的「不可能三角」吗?

3月21日&#xff0c;以“‘AI商业’进化论”为主题的行业峰会在中欧国际工商学院上海校区成功举行&#xff0c;并发布人工智能与商业创新白皮书。本次活动由中欧国际工商学院与特赞科技Tezign联合主办&#xff0c;中欧特赞人工智能与商业创新研究基金承办&#xff0c;中欧AI与营…

计算机网络 OSI参考模型

目录 OSS七层 OSI通信过程1 OSI通信过程2 应用层 表示层 会话层 传输层 网络层 数据链路层 物理层 OSS七层 OSI通信过程1 OSI通信过程2 应用层 表示层 会话层 传输层 网络层 数据链路层 物理层

探索新一代大模型代理(LLM agent)及其架构

在人工智能大模型(AI)的浪潮中&#xff0c;2023年我们见证了检索增强生成(Retrieval Augmented Generation, RAG)的兴起&#xff0c;而2024年则无疑成为了“代理”agent的元年。各大AI企业纷纷投身于聊天机器人代理的研发中&#xff0c;工具如MultiOn通过与外部网站的连接实现了…

AI应用案例(1)——智能工牌和会话质检

今天开辟一个新的模块&#xff0c;自己平时也搜集一些典型的行业应用案例&#xff0c;不如就记录到C站&#xff0c;同时和大家也是个分享好了。 今天分享的企业和产品&#xff0c;是循环智能的智能工牌。 这个产品应用场景清晰&#xff0c;针对的行业痛点合理&#xff0c;解决…

HMTL+JS+CSS实现贪吃蛇游戏,包含有一般模式,困难模式,还有无敌模式

HMTLJSCSS实现贪吃蛇游戏&#xff0c;包含有一般模式&#xff0c;困难模式&#xff0c;还有无敌模式&#xff08;可以穿墙死不了&#xff0c;从左边进去可以从右边出来&#xff09;&#xff0c;显示当前分数和最高分&#xff0c;吃到的球颜色可以叠加到蛇身体上 为了适配手机端…

内网渗透——红日靶场二

目录 一、前期准备 DC机配置 PC机配置 WEB机配置 将PC机和WEB机的IP地址进行更改 开启WEB服务 二、外网探测 1.使用nmap扫描 2.目录扫描 3.漏洞扫描 &#xff08;1&#xff09;CVE-2017-3506&#xff08;getshell失败&#xff09; &#xff08;2&#xff09;CVE-201…

【Unity】处理文字显示不全的问题

1.选中字体文件&#xff0c;检查 MultiAtlasTeextures 是否勾选&#xff0c;未勾选的话&#xff0c;先勾选保存后查看是否显示正常 2.勾选后未正常显示&#xff0c;则在搜索框中输入未显示的文本&#xff0c;确认字体图集是否包含该文本&#xff0c;然后点击Update Atlas Textu…

汽车诊断开发入门以及OBD检测

一、OBD 概述 定义&#xff1a;OBD 即 On - Board Diagnostics&#xff0c;车载自动诊断系统。它能实时监测车辆各项系统和部件状态&#xff0c;以此帮助诊断故障并预警。设计初衷与发展&#xff1a;最初设计目的是控制汽车尾气排放&#xff0c;确保符合环境标准。随着技术进步…

Ingredient-oriented Multi-Degradation Learning for Image Restoration论文阅读

摘要&#xff1a;重点在于关联多个任务本质的联系。 不同恢复任务的关联性很重要。 揭示退化现象的内在机理联系很有意义。 多合一的方法能在单一模型中处理多种退化问题&#xff0c;可扩展性较差。 成分导向范式挖掘不同图像退化现象背后的物理规律或特征模式。 成分导向退化重…

java项目挂机自动重启操作指南

前段时间有个伙伴问我&#xff0c;java项目挂机怎么自动重启。。。。。。今天就写一个 .sh脚本来实现应用挂机的自动重启功能 #!/bin/bash # 查询mita的进程个数 countps -ef | grep mita.jar | grep -v "grep" | wc -l # echo $count nowtimedate "%Y-%m-%d %H…

Vue el-table-column内el-tooltip识别换行符 \n

结构&#xff1a; <el-table-column prop"callSummary" width"300" label"摘要"><template slot-scope"scope"><el-tooltip class"item" effect"dark" placement"top"><div v-ht…

【C++指南】一文总结C++二叉搜索树

&#x1f31f; 各位看官好&#xff0c;我是egoist2023&#xff01; &#x1f30d; 种一棵树最好是十年前&#xff0c;其次是现在&#xff01; &#x1f680; 今天来学习C二叉搜索树的实现。 &#x1f44d; 如果觉得这篇文章有帮助&#xff0c;欢迎您一键三连&#xff0c;分享给…

【报告】内镜视频图像分析Foundation Model

来源&#xff1a;医疗基础模型 仅供个人学习&#xff0c;侵权请联系我删除

使用HTML5和CSS3实现炫酷的3D立方体动画

使用HTML5和CSS3实现炫酷的3D立方体动画 项目介绍 本文将详细介绍如何使用HTML5和CSS3技术实现一个交互式3D立方体动画。这个项目不仅展示了现代Web前端技术的强大功能&#xff0c;还能帮助读者深入理解CSS3的3D变换和动画特性。 技术栈 HTML5CSS3 (transform-style, persp…

MySQL数据库和表的操作之SQL语句

&#x1f3af; 本文专栏&#xff1a;MySQL深入浅出 &#x1f680; 作者主页&#xff1a;小度爱学习 MySQL数据库和表的操作 关系型数据库&#xff0c;都是遵循SQL语法进行数据查询和管理的。 SQL语句 什么是sql SQL&#xff1a;结构化查询语言(Structured Query Language)&…

多模态大语言模型arxiv论文略读(二)

Identifying the Correlation Between Language Distance and Cross-Lingual Transfer in a Multilingual Representation Space ➡️ 论文标题&#xff1a;Identifying the Correlation Between Language Distance and Cross-Lingual Transfer in a Multilingual Representat…

全局曝光与卷帘曝光

文章目录 曝光方式优点缺点应用场景 为何全局曝光帧率比卷帘曝光方式低 卷帘曝光和全局曝光是CMOS传感器两种常见的曝光模式&#xff0c;以下是二者的对比&#xff1a; 参考&#xff1a;B站优致谱视觉 曝光方式 卷帘曝光&#xff1a;传感器的每一行像素按顺序逐行扫描曝光&…

【一起来学kubernetes】31、Helm使用详解

一、Helm 简介 Helm 是 Kubernetes 的包管理工具&#xff0c;类比 Linux 中的 yum 或 apt&#xff0c;用于简化应用的打包、部署和版本管理。其核心功能包括&#xff1a; Chart 管理&#xff1a;将 Kubernetes 资源&#xff08;Deployment、Service 等&#xff09;打包为可复…