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

题解:B4274 [蓝桥杯青少年组省赛 2023] 数字游戏

题解:B4274 [蓝桥杯青少年组省赛 2023] 数字游戏

前言

题目传送门

这么水的绿题,还可以写题解!

思路讲解

首先想到的肯定是暴力!

模拟这个过程,时间复杂度接近 \(O(n^2)\),领取 TLE 大礼包。

然后我们考虑优化,发现对于一个数字,我们只需要知道它的值与数量即可,不需要知道它的位置。

因此,我们可以维护一个结构体数组记录一个数的值与其出现的次数,这样我们不需要一个一个的操作,能够大面积的操作。

时间复杂度就是 \(O(m)\),注意 \(m\) 是有多少个不同的数字。

操作的时候用 \(l\)\(r\) 分别表示左右边界,我们只需要遍历这个区间内的数字即可。

特别注意!!!

  1. 对于一个数字,加入它是最大值,操作后它并不是消失了,而是变成了次大值。
  2. 对于一个数字,加入它是最小值,操作后它并不是消失了,而是变成了次小值。
  3. 两种不同的操作是轮流进行的。

就是介么简单捏!

AC Code

注释版:

#include <bits/stdc++.h>
using namespace std;const int MAXN = 1e6 + 5;  // 定义最大可能的数字范围int n;                     // 输入的数字个数
int a[MAXN];               // 存储输入的数字
int cur[MAXN];             // 统计每个数字出现的次数// 定义结构体,存储数字及其出现次数
struct node {int val;  // 数字的值int num;  // 该数字出现的次数
};
node cnt[MAXN];  // 存储所有数字及其出现次数(按值从小到大排序)int main() {// 输入阶段cin >> n;int l = 1, r = 0;  // 双指针,l指向当前最小数字,r指向当前最大数字for (int i = 1; i <= n; i++) {cin >> a[i];cur[a[i]]++;  // 统计每个数字出现的次数}// 预处理阶段:将统计结果存入cnt数组(自动按数字大小排序)for (int i = 1; i <= 1e6; i++) {if (cur[i]) {  // 如果数字i出现过cnt[++r].val = i;  // 存储数字icnt[r].num = cur[i];  // 存储数字i的出现次数}}long long ans = 0;  // 记录总操作次数(可能很大,用long long)// 主循环:当数字种类 >=3 时继续操作while (r - l + 1 >= 3) {// 计算当前最小值和最大值的较小出现次数int sum = min(cnt[l].num, cnt[r].num);// 操作1:将最小值转化为次小值ans += sum;  // 操作次数增加sumcnt[l].num -= sum;  // 最小值减少sum次cnt[l + 1].num += sum;  // 次小值增加sum次(因为最小值变成了次小值)// 如果最小值被消耗完,移动左指针if (!cnt[l].num) {l++;  // 指向新的最小值// 检查剩余数字种类是否<=2if (r - l + 1 <= 2) {// 输出结果(注意:ans + sum - 1是因为最后一次操作可能未完成)cout << ans + sum - 1 << " " << cnt[l].val << " " << cnt[r].val << endl;return 0;}}// 操作2:将最大值转化为次大值ans += sum;  // 操作次数增加sumcnt[r].num -= sum;  // 最大值减少sum次cnt[r - 1].num += sum;  // 次大值增加sum次(因为最大值变成了次大值)// 如果最大值被消耗完,移动右指针if (!cnt[r].num) {r--;  // 指向新的最大值// 检查剩余数字种类是否<=2if (r - l + 1 <= 2) {// 输出结果cout << ans << " " << cnt[l].val << " " << cnt[r].val << endl;return 0;}}}return 0;
}

无注释版:

#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1e6 + 5;
int n;
int a[MAXN];
int cur[MAXN];
struct node
{int val, num;
};
node cnt[MAXN];
int main()
{cin >> n;int l = 1, r = 0;for (int i = 1; i <= n; i++){cin >> a[i];cur[a[i]]++;}for (int i = 1; i <= 1e6; i++){if (cur[i]){cnt[++r].val = i;cnt[r].num = cur[i];}}long long ans = 0;while (r - l + 1 >= 3){int sum = min(cnt[l].num, cnt[r].num);ans += sum;cnt[l].num -= sum;cnt[l + 1].num += sum;if (!cnt[l].num){l++;if (r - l + 1 <= 2){cout << ans + sum - 1 << " " << cnt[l].val << " " << cnt[r].val << endl;return 0;}}ans += sum;cnt[r].num -= sum;cnt[r - 1].num += sum;if (!cnt[r].num){r--;if (r - l + 1 <= 2){cout << ans << " " << cnt[l].val << " " << cnt[r].val << endl;return 0;}}}cout << ans << " " << cnt[l].val << " " << cnt[r].val << endl;return 0;
}
http://www.jsqmd.com/news/187512/

相关文章:

  • 【C++内核性能优化终极指南】:揭秘高效代码背后的5大核心技术
  • 为什么你的C++网络程序总是崩溃?这5个错误处理陷阱你必须知道
  • C++高性能内核开发秘籍(底层优化罕见公开)
  • 双十一购物节营销战:电商平台用lora-scripts批量产出门槛图
  • 为什么你的C++物理引擎总出现穿透现象?揭秘碰撞精度丢失的7大根源
  • 为什么你的游戏画面总是差一截?,深度剖析C++渲染质量关键因素
  • CatBoost特征重要性分析实战
  • C++分布式系统容错设计:如何在3步内完成故障自愈?
  • 构建企业级AI内容生成系统:基于lora-scripts的架构设计
  • 法律文书自动生成:lora-scripts在法务领域的微调实践
  • 临终关怀服务创新:用lora-scripts帮助患者留存最后的艺术记忆
  • 为什么你的C++分布式系统扛不住故障?(容错机制缺失的真相)
  • A/B测试不同LoRA模型生成效果:科学决策方法论
  • 【Java毕设源码分享】基于springboot+vue的流动摊位管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)
  • C++元编程调试难题:如何在5步内定位并解决复杂的编译期错误
  • C#调用Python接口运行lora-scripts脚本的可行性分析
  • C++内核级性能调优实战:掌握这3个技巧,程序效率提升10倍
  • 导师推荐!继续教育必用9款一键生成论文工具测评
  • 从入门到精通:掌握lora-scripts全流程操作手册
  • 【Java毕设源码分享】基于springboot+vue的建材租赁系统的设计与实现(程序+文档+代码讲解+一条龙定制)
  • 从节点崩溃到数据一致性:C++分布式容错全链路应对策略
  • 【Java毕设源码分享】基于springboot+vue的员工岗前培训学习平台的设计与实现(程序+文档+代码讲解+一条龙定制)
  • 基于lora-scripts的AI绘画定制服务平台搭建思路
  • 亲子互动新玩法:父母与孩子共同训练家庭专属绘画AI
  • C++游戏渲染性能瓶颈分析与突破(渲染质量提升实战指南)
  • 【Java毕设源码分享】基于springboot+小程序的智能笔记的开发与应用(程序+文档+代码讲解+一条龙定制)
  • 圣诞节创意装饰:lora-scripts生成个性化圣诞贺卡图案
  • train.py命令行参数说明:--config之外还能传什么?
  • 体育赛事宣传创新:训练球队专属风格的应援物设计生成器
  • 快速部署LoRA模型:将lora-scripts训练结果接入WebUI平台