Luogu P8800 [蓝桥杯 2022 国 B] 卡牌 题解
我们看到这样一句话:
请问小明最多能凑出多少套牌?
很明显用贪心可以做了。
首先要理解一个东西,卡牌套数等于最少的卡牌牌数。因为一套卡牌需要所有卡牌各一张,所以对于最少的卡牌,它如果只有 \(x\) 张,则只能有 \(x\) 套卡牌含有最少的卡牌。再多的其他卡牌就没用了,所以卡牌套数等于最少的卡牌牌数。
那具体怎么贪心呢?使卡牌套数最多。由于卡牌套数等于最少的卡牌牌数,只需要尽量让最终各种卡牌数量接近即可。那就优先画数量少的卡牌,直到空卡牌用完。
每次 \(O(n)\) 选择最小的卡牌,复杂度会很高。由于这个贪心策略是要连续选择最小的,所以可以通过排序来降低复杂度。
最后还有一个问题:可画的卡牌数有限制。还是根据卡牌套数等于最少的卡牌牌数,在空卡牌够用的情况下,最终的卡牌套数取决于初始卡牌数与可画卡牌数的和最少的卡牌。所以可以判断目前求得的卡牌数是否大于每张卡牌初始卡牌数与可画卡牌数的和的最小值来解决这个问题。若小于,继续贪心。若大于,则证明空卡牌够用,但受可画的卡牌数的限制,卡牌套数只能为每张卡牌初始卡牌数与可画卡牌数的和的最小值。(好吧这一段有点难理解,可以结合代码里的注释理解)
时间复杂度为 \(O(n\log n+n)\) ,可以通过。
最后是丑陋的的代码:
#include <bits/stdc++.h>
using namespace std;
long long n,m,an=0,min1=5000000000,ans=0,a[500000],b;
int main()
{
scanf("%lld%lld",&n,&m);
for(int i=0;i<n;i++)scanf("%lld",&a[i]);
for(int i=0;i<n;i++)
{
scanf("%lld",&b);
if(a[i]+b<min1) //这里是求出初始卡牌数与可画卡牌数的和的最小值
min1=a[i]+b;
}
sort(a,a+n); //STL自带的排序
ans=a[0]; //最开始就有的卡牌套数
for(int i=0;i<n;i++)
{
if(i==n-1&&an<m) //数组a扫到最后了且空卡牌还有剩余
{
ans+=(m-an)/n; //平均分
if(ans>min1)ans=min1; //防止超过初始卡牌数与可画卡牌数的和的最小值
break;
}
if(a[i]!=a[i+1]) //数量不相等,给前i+1张卡牌分空卡牌
{
an+=(i+1)*(a[i+1]-a[i]); //用去的空卡牌
ans+=(a[i+1]-a[i]); //卡牌套数增加
}
if(an>m) //用去的空卡牌数超过了空卡牌总数
{
an-=(i+1)*(a[i+1]-a[i]); //撤销增加
ans-=(a[i+1]-a[i]);
ans+=((m-an)/(i+1)); //平均分
break; //接下来肯定不用再分了,可以退出了
}
if(ans>min1) //判断是否超过初始卡牌数与可画卡牌数的和的最小值
{
ans=min1;
break; //可以退出了
}
}
printf("%lld",ans); //输出结果
return 0;
}
Luogu P8800 [蓝桥杯 2022 国 B] 卡牌 题解的更多相关文章
- P8796 [蓝桥杯 2022 国 AC] 替换字符
题面 给定一个仅含小写英文字母的字符串 \(s\) 和 \(m\) 次操作,每次操作选择一个区间 \([l_i,r_i]\) 将 \(s\) 的该区间中的所有字母 \(x_i\) 全部替换成字母 \( ...
- 2015年蓝桥杯B组C/C++决赛题解
2015年第六届蓝桥杯B组C/C++决赛题解 点击查看2015年第六届蓝桥杯B组C/C++国赛题目(不含答案) 1.积分之迷 三重循环 枚举A,B,C的值,如果满足两个条件:3个A + 7个B ...
- 2018年蓝桥杯A组C/C++决赛题解
2018年第九届蓝桥杯A组C/C++决赛题解 点击查看视频题解 点击查看2018年蓝桥杯A组C/C++决赛题目(不含答案) 1:三角形面积 画个图,求三角形面积,可以用外接长方形 - 其他多余区域面积 ...
- 2016年蓝桥杯B组C/C++决赛题解
2016年第七届蓝桥杯B组C/C++决赛题解 2016年蓝桥杯B组C/C++决赛题目(不含答案) 1.一步之遥 枚举解方程,或者套模板解线性方程 #include<bits/stdc++.h&g ...
- 2018年蓝桥杯B组C/C++决赛题解
2018年第九届蓝桥杯B组C/C++决赛题解 点击查看2018年蓝桥杯B组C/C++决赛题目(不含答案) 1.换零钞 ok 枚举 设x表示1元钱的个数,y表示2元钱的个数,z表示5元钱的个数 x+21 ...
- 蓝桥杯java试题《洗牌》
问题描述 小弱T在闲暇的时候会和室友打扑克,输的人就要负责洗牌.虽然小弱T不怎么会洗牌,但是他却总是输. 渐渐地小弱T发现了一个规律:只要自己洗牌,自己就一定会输.所以小弱T认为自己洗牌不够均匀,就独 ...
- 第十届蓝桥杯省赛JavaB组个人题解
前言 以下的第十届蓝桥杯Java B组省赛的题目题解只是我个人的题解,提供一些解题思路,仅作参考,如有错误,望大家指出,不甚感激,我会及时更改. 试题 A: 组队 ----- 答案:490 [问题描述 ...
- 2017年蓝桥杯B组C/C++决赛题解
2017年蓝桥杯B组C/C++决赛题目(不含答案) 1.36进制 ok 求36进制,类比二进制转10进制,36^3 + 36^2 + 36^1 + 36^0 2.磁砖样式 ok dfs搜索 我自己写的 ...
- Java实现 蓝桥杯 算法提高 抽卡游戏
试题 算法提高 抽卡游戏 某个抽卡游戏卡池抽出限定卡的概率为p,该游戏有一个"井"的机制,抽满k次卡后直接送这张限定卡.试求获得这张限定卡需要的期望抽卡次数.输入为一行,用空格隔开 ...
- P8701 [蓝桥杯 2019 国 B] 第八大奇迹
简要题意 你需要维护一个长度为 \(L\) 的序列 \(a\),初始时全部都是 \(0\),有 \(N\) 个操作,支持: C p x,将 \(a_p\) 修改为 \(x\). Q a b,输出 \( ...
随机推荐
- 在WampServer下增加PHP版本
WampServer更新比较慢,需要新版本的php时就需要我们自己去添加了. 步骤(这里默认你已经安装好了wampserver): 下载解压: 增加配置文件 重启wampserver 去php官网根据 ...
- Windows 提权指南
男儿若遂平生志,五经勤向窗前读. 导航 壹 - Se 特权 贰 - RunAs 叁 - 弱服务 肆 - Windows 内核 伍 - 密码搜寻 陆 - 杂项 AlwaysInstallElevated ...
- 把 Java WebApi 快速转为 Mcp-Server(使用 Solon AI MCP)
solon-ai-mcp,提供了各种 mcp 相关能力,支持 java8, java11, java17, java21, java24 .是 solon-ai 项目的重要组成部分,也可以嵌入到 sp ...
- GitLab CI/CD 的配置文件 .gitlab-ci.yml 简介
〇.前言 .gitlab-ci.yml 文件主要用于项目的自动化部署配置,自动化可以大大提升团队效率,但同时这个文件的内容也比较复杂,弄清楚也并非易事,本文将对此文件的内容进行简单介绍,供参考. 另外 ...
- Java编程--多例设计模式
多例设计模式 多例设计模式(Multiton Pattern),有时也被称为对象池(Object Pool)模式,是一种创建型设计模式.与单例模式不同,多例模式允许创建并管理多个实例,每个实例都有一个 ...
- 【记录】Docker|Ubuntu Docker 修改dockerfile换源、主机共享网络解决apt update 失败
本文测试环境:虚拟机 Ubuntu20.04 Docker20 1 修改dockerfile dockerfile第二行后面加如下内容,一键换源: RUN sed -i s:/archive.ubun ...
- 【HUST】网安|计算机网络安全实验|实验二 DNS协议漏洞利用实验
写在最前: 这是我个人的实验记录,实现方式有很多种,多台虚拟机更容易做netwox. 认真整理和记录了一下容易出问题的地方. 代码仓库开了. 文章目录 涉及代码的仓库地址 计算机网络安全实验二 DNS ...
- 利用java8 stream流将一个对象集合转换成另一个对象集合
//需要字段名一致 List<UserCheckData> userCheckDataList = null; List<UserCheckPO> list = userChe ...
- 二:简单的C/S阻塞模型
C/S阻塞模型是指客户端/服务器阻塞模型,它描述了一种基于阻塞的网络通信方式.在阻塞模型中,客户端发送请求给服务器,并等待服务器的响应.在等待服务器响应的过程中,客户端的操作会被阻塞,直到服务器响应返 ...
- Pytorch之Tensor学习
Pytorch之Tensor学习 Tensors是与数组和矩阵类似的数据结构,比如它与numpy 的ndarray类似,但tensors可以在GPU上运行.实际上,tensors和numpy数组经常共 ...