当前位置:网站首页>码蹄集 - MT3029 - 新月轩就餐
码蹄集 - MT3029 - 新月轩就餐
2022-08-04 16:34:00 【Tisfy】
新月轩就餐
时间限制:1秒
空间限制:128M
题目描述
新月轩是璃月最高档的餐厅,这里有m位顶级厨师的手艺。但是餐厅有个奇怪的规定,顾客需要给出两个数字a和b,代表品尝菜单的第a到第b道佳肴,每道佳肴的价钱相同。你的小伙伴小码哥现在希望品尝到所有名厨的手艺,但是又想最小化付的钱。
请你为小码哥出谋划策,想想怎样给定a和b能满足他的要求。保证数据有解。
如有多组解,输出a最小的那组。
输入描述
第一行两个整数 n,m,分别表示佳肴总数和这些佳肴一共由多少厨师所做
第二行包含n个整数ai,代表每道佳肴对应厨师的编号
数据范围
1<=n<=1e6
1<=ai<=m<=2000
输出描述
一行两个整数 a,b
样例一
输入
15 5
1 5 1 2 5 4 3 4 2 1 2 5 5 2 4
输出
3 7
题目分析
用vector<int> a[i]
记录大厨i
做的所有菜分别为第几道
用int originalData[i];
记录第i
道菜的大厨是谁
用int thInA[i];
记录第i
道菜是这个做菜大厨做的第几道菜
之后,我们可以使用一个“小数先出队”的优先队列,初始时入队每个大厨的第一道菜。
每次出队一道菜(编号记为x
),由originalData
可以得到这道菜是大厨originalData[x]
做的,由thInA
可以得到这道菜是这个大厨的第thInA[x]
道菜。
既然这个菜出队了,那么想要品尝所有大厨的菜,就必须把这个大厨的下一道菜入队。
这样,队列中始终有 m m m道菜,分别来自 m m m个大厨。
每次操作,队列中的最大值(入队时可以记录下来)和队列中的最小值(队首元素)之差就是当前方案的a b跨度
。
如果当前方案优于历史最佳方案,就更新答案。
直到某个大厨没有下一道菜了,退出循环。
AC代码
/* * @Author: LetMeFly * @Date: 2022-08-03 21:48:32 * @LastEditors: LetMeFly * @LastEditTime: 2022-08-03 22:44:41 */
#include <bits/stdc++.h>
using namespace std;
#define mem(a) memset(a, 0, sizeof(a))
#define dbg(x) cout << #x << " = " << x << endl
#define fi(i, l, r) for (int i = l; i < r; i++)
#define cd(a) scanf("%d", &a)
typedef long long ll;
vector<int> a[2001];
int originalData[1000010];
int thInA[1000010];
// int loc[2001];
priority_queue<int, vector<int>, greater<int>> pq;
int main() {
int n, m;
cin >> n >> m;
for (int i = 1; i <= n; i++) {
cd(originalData[i]);
thInA[i] = a[originalData[i]].size();
a[originalData[i]].push_back(i);
}
int ans = INT_MAX;
int ansA, ansB;
int maxValInQueue = 0;
for (int i = 1; i <= m; i++) {
pq.push(a[i][0]);
maxValInQueue = max(maxValInQueue, a[i][0]);
}
while (true) {
int minValInQueue = pq.top();
pq.pop();
if (maxValInQueue - minValInQueue < ans) {
ans = maxValInQueue - minValInQueue;
ansA = minValInQueue, ansB = maxValInQueue;
}
int removedWhose = originalData[minValInQueue];
int thOfHim = thInA[minValInQueue];
thOfHim++;
if (thOfHim == a[removedWhose].size()) {
break;
}
int newVal = a[removedWhose][thOfHim];
maxValInQueue = max(maxValInQueue, newVal);
pq.push(newVal);
}
cout << ansA << " " << ansB << endl;
return 0;
}
虽然代码可以复制,但最好还是自己理解后再敲哦
原创不易,转载请附上原文链接哦~
Tisfy:https://letmefly.blog.csdn.net/article/details/126154056
边栏推荐
猜你喜欢
15天升级打怪,成为虚拟时尚创作者
平稳发展 | 西欧地区手游玩家的数据和洞察
B 站又上热搜了, HR 称「核心用户都是 Loser」
911S5正式谢幕后 如何找到一个好用的替代品
历史上的今天:微软研究院的创始人诞生;陌陌正式上线;苹果发布 Newton OS
九联_UNT400G_S905L2_(联通)_线刷固件包
Mobile zte ZXV10 B860AV2. 1 - A_S905L2_MT7668_ wire brush the firmware package
【打卡】广告-信息流跨域ctr预估(待更新)
不需要服务器,教你仅用30行代码搞定实时健康码识别
Real-Time Rendering 4th相关资源整理(无需积分 传火)
随机推荐
跨链桥已成行业最大安全隐患 为什么和怎么办
MySQL学习之运算符
寻找消失的类名
广东移动魔百盒M411A _905L3_线刷固件包
【Jprofile 11.0 安装】
九联_UNT400G_S905L2_(联通)_线刷固件包
平稳发展 | 西欧地区手游玩家的数据和洞察
推荐 7 月份 yyds 的开源项目
机器人示教编程与离线编程的优缺点对比
SQL语言的分类以及数据库的导入
奖金池高达 20 万,RTE 2022 创新编程挑战赛正式开启
【Pick-in】Advertising-information flow cross-domain CTR estimation (to be updated)
代码重构:面向单元测试
gcc7.5.0编译ceres-solver报错‘is_trivially_default_constructible’ is not a member of ‘std’
什么是APS?APS+MES如何解决生产难题?
越来越火的图数据库到底能做什么?
面了三十个人,说说真实感受
可视化大屏丑?这篇文章教你如何做美观大屏!
贝叶斯优化核极限学习机KELM用于回归预测
移动海信IP102H_905L3-B_线刷固件包