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

题解:洛谷 P1638 逛画展

【题目来源】

洛谷:P1638 逛画展 - 洛谷

【题目描述】

博览馆正在展出由世上最佳的 \(m\) 位画家所画的图画。

游客在购买门票时必须说明两个数字,\(a\)\(b\),代表他要看展览中的第 \(a\) 幅至第 \(b\) 幅画(包含 \(a,b\))之间的所有图画,而门票的价钱就是一张图画一元。

Sept 希望入场后可以看到所有名师的图画。当然,他想最小化购买门票的价格。

请求出他购买门票时应选择的 \(a,b\),数据保证一定有解。

若存在多组解,输出 \(a\) 最小的那组

【输入】

第一行两个整数 \(n,m\),分别表示博览馆内的图画总数及这些图画是由多少位名师的画所绘画的。

第二行包含 \(n\) 个整数 \(a_i\),代表画第 \(i\) 幅画的名师的编号。

【输出】

一行两个整数 \(a,b\)

【输入样例】

12 5
2 5 3 1 3 2 4 1 1 5 4 3

【输出样例】

2 7

【算法标签】

《洛谷 P1638 逛画展》 #二分# #单调队列# #队列# #双指针,two-pointer# #USACO#

【代码详解】

#include <bits/stdc++.h>
using namespace std;const int MAX_N = 1000005;  // 定义数组最大长度
const int MAX_M = 2005;     // 定义颜色种类最大数量
int n, m;                   // n: 珠子数量, m: 颜色种类数
int a[MAX_N];               // 存储珠子颜色序列
int cnt[MAX_M];             // 记录当前窗口中各颜色出现次数
int num;                    // 记录当前窗口中不同颜色数量
int len = 1e9;              // 记录满足条件的最短长度(初始设为极大值)
int l, r;                   // 记录最优解的左右边界int main()
{// 输入珠子数量和颜色种类数cin >> n >> m;// 输入珠子颜色序列for (int i = 1; i <= n; i++)cin >> a[i];// 初始化滑动窗口指针和计数器int i = 1, j = 1;       // i: 窗口左边界, j: 窗口右边界cnt[a[1]] = 1;          // 初始化第一个珠子的颜色计数num = 1;                // 当前窗口包含1种颜色// 滑动窗口法寻找最短包含所有颜色的子串while (j <= n){// 如果当前颜色种类不足,扩大右边界if (num < m){j++;            // 右边界右移cnt[a[j]]++;    // 新颜色计数增加// 如果是新出现的颜色,增加颜色计数if (cnt[a[j]] == 1)num++;}// 如果当前窗口包含所有颜色if (num == m){// 更新最优解if (len > j - i + 1){len = j - i + 1;  // 更新最短长度l = i;            // 记录左边界r = j;            // 记录右边界}// 尝试缩小左边界cnt[a[i]]--;      // 左边界的颜色计数减少// 如果某种颜色数量减为0,减少颜色计数if (cnt[a[i]] == 0)num--;i++;              // 左边界右移}}// 输出最优解的左右边界cout << l << " " << r;return 0;
}
// 使用acwing模板二刷
#include <bits/stdc++.h>
using namespace std;const int N = 1000006;      // 定义数组最大长度
const int COLOR_MAX = 2005;  // 定义颜色种类最大数量
int n, m;                   // n: 珠子数量, m: 颜色种类数
int a[N];                   // 存储珠子颜色序列
int cnt[COLOR_MAX];         // 记录当前窗口中各颜色出现次数
int num;                    // 记录当前窗口中不同颜色数量
int len = 1e9;              // 记录满足条件的最短长度(初始设为极大值)
int l, r;                   // 记录最优解的左右边界int main()
{// 输入珠子数量和颜色种类数cin >> n >> m;// 输入珠子颜色序列for (int i = 1; i <= n; i++)cin >> a[i];// 初始化滑动窗口和计数器cnt[a[1]] = 1;          // 第一个珠子的颜色计数num = 1;                // 当前窗口包含1种颜色// 滑动窗口法寻找最短包含所有颜色的子串for (int i = 1, j = 1; j <= n; i++)  // i:左边界, j:右边界{// 当颜色种类不足时,扩大右边界while (num < m && j <= n){j++;            // 右边界右移cnt[a[j]]++;    // 新颜色计数增加// 如果是新出现的颜色,增加颜色计数if (cnt[a[j]] == 1)num++;}// 如果当前窗口包含所有颜色if (num == m){// 更新最优解if (len > j - i + 1){len = j - i + 1;  // 更新最短长度l = i;            // 记录左边界r = j;            // 记录右边界}// 尝试缩小左边界cnt[a[i]]--;      // 左边界的颜色计数减少// 如果某种颜色数量减为0,减少颜色计数if (cnt[a[i]] == 0)num--;}}// 输出最优解的左右边界cout << l << " " << r;return 0;
}

【运行结果】

12 5
2 5 3 1 3 2 4 1 1 5 4 3
2 7
http://www.jsqmd.com/news/392548/

相关文章:

  • 0基础能不能转大模型?到底怎么转?大模型实战指南:小白程序员2026年转行AI必读(收藏版)
  • 探寻2026伺服油压机口碑佳企,解锁行业新趋势,粉末压机/伺服油压机/电子压床/伺服热压机,伺服油压机企业哪个好 - 品牌推荐师
  • 小白福利!收藏这份AI大模型自学路线,带你从入门到精通(附104G免费学习资源)
  • 传感器02-激光雷达(LiDAR):解密自动驾驶的“千里眼”——激光雷达(LiDAR)全方位深度解析
  • 传感器01-相机:
  • AI技术干货|大语言模型知识大全!从入门到精通,通俗易懂!|附391页PDF文件下载
  • 2026选圣女果选果机,这些制造商别错过!小蕃茄选果机/AI无损测糖选果机/智能水果分选机,选果机实力厂家排行榜 - 品牌推荐师
  • 2026多模态大语言模型技术发展报告|附74页PDF文件下载
  • day89(2.18)——leetcode面试经典150
  • 【Docker高级篇】Docker网络进阶:Host/None模式用法拆解,新手也能避开配置坑
  • 【Docker高级篇】容器日志只懂docker logs?Prometheus+Grafana+ELK集成实操,监控效率翻倍
  • 数据产品微服务架构:大数据系统的模块化设计
  • 水处理设备2.5D、2D器械插画设计
  • 大模型工程师?别被吓到!月薪翻倍攻略,小白也能收藏看懂!
  • python: Command Pattern
  • 人音教育网站及移动端界面设计(打造属于你的音乐学习圈)
  • 2026.2.18
  • Python Web 开发进阶实战:联邦学习优秀的平台 —— 在 Flask + Vue 中构建隐私保护的分布式 AI 训练平台
  • 一文搞懂【C++学习】十大经典排序算法全解析:原理、代码、动态图解与性能对比:核心原理+实战案例
  • 小白程序员必看:一文看懂大模型与业务流程、工作流、Agent Skills、Agentic Workflow的区别与融合之道
  • 数字员工与AI销冠系统是什么?它们为企业智能运营带来了哪些变革?
  • 普通人转行AI的真实路径
  • 燃料电池空气路建模与控制simulink模型 包括:燃料电池电堆模型(阴极,阳极,水传递
  • 2026年,哪些保健品有抗衰老功效值得关注,保健品/抗衰老片,保健品食品哪个好 - 品牌推荐师
  • 8周冲刺大模型Offer!小白转行/考研失利也能逆袭的春招秘籍_转行大模型开发了
  • C++游戏开发之旅 13
  • 裸辞转行AI大模型:小白也能看懂的成功经验与收藏指南_我的AI大模型转行记录
  • 2026全网最详细的AI大模型学习路线_大模型学习路线
  • 大模型学习路线(2026最新)神仙级大模型教程分享,不用感谢
  • 浙江宇视科技有限公司APP开发工程师(Android/iOS/鸿蒙)职位