当前位置:网站首页>码蹄集 - 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
边栏推荐
猜你喜欢

面试官:多个线程执行完毕后,才执行另一个线程,该怎么做?

刷爆朋友圈!Alibaba出品亿级并发设计速成笔记太香了!

07-输入输出系统

越来越火的图数据库到底能做什么?

花 30 美金请 AI 画家弄了个 logo,网友:画得非常好,下次别画了!

[TA-Frost Wolf_may-"Hundred Talents Project"] Art 2.7 Metallic and Speculer Process

嵌入式系统驱动初级【6】——内核定时器

湖北移动HG680-LV_S905L3B_线刷固件包

Minecraft HMCL 第三方启动器使用教程

Hubei Mobile HG680-LV_S905L3B_wire brush firmware package
随机推荐
花 30 美金请 AI 画家弄了个 logo,网友:画得非常好,下次别画了!
历史上的今天:微软研究院的创始人诞生;陌陌正式上线;苹果发布 Newton OS
博云入选Gartner中国云原生领域代表性厂商
测试开发必备技能-Jmeter二次开发
B 站又上热搜了, HR 称「核心用户都是 Loser」
全球电子产品需求放缓 三星手机越南工厂每周只需要干 3~4 天
Check which user permissions are assigned to each database, is there an interface for this?
UWP WPF 解决 xaml 设计显示异常
B站回应HR称核心用户是Loser;微博回应宕机原因;Go 1.19 正式发布|极客头条
flink cdc怎么指定位点,从某个位点开始消费mysql的Binlog?
实践:二进制数据处理与封装
现代 ABAP 编程语言中的正则表达式
js判断一个对象是否在一个对象数组中
Minecraft 我的世界 .minecraft下的各个文件夹的用处
"Distributed cloud best practices" BBS, on August 11, shenzhen
Does DMS have an interface to get the list of databases under each instance?
HCIP笔记(7)
面试官:多个线程执行完毕后,才执行另一个线程,该怎么做?
【笔试题】-【日常记录】
动手学深度学习_AlexNet