题解:CF1945G(Cook and Porridge)

题解:CF1945G(Cook and Porridge)

题目翻译:

n n n 个人排队喝粥,对于第 i i i 个人,他有一个优先程度 k i k_i ki,并且喝一碗粥需要花费 s i s_i si 分钟。

供应粥的厨师总共工作 D D D 分钟,对于每一分钟,他会给排在队伍最前面的一个人打一碗粥,随后这个人离开队伍去喝粥。假设这个人是第 i i i 个人,并且此时是第 x x x 分钟,那么在第 x + s i x+s_i x+si 分钟这个人归队,队伍最后面所有优先程度严格小于他的人站在他后面,换句话说,这个人最终站的位置的后面所有的人的优先程度都小于他,这个人紧挨着的前面的一个人的优先程度大于等于他。

试问在 D D D 分钟内每个人能否都喝到粥?若可以,报告是在第几分钟;若不可以,输出 -1

我们可以暴力的去枚举每一次操作,唯一的问题是如果我们按照题目的原要求去维护整个队伍,最终的时间复杂度是 O ( n 2 ) O(n^2) O(n2) 的,无法通过。因此,我们考虑优化。我们不难发现,如果最初站队伍就是按照优先程度降序排列的,那么每一个时刻队伍都是按照优先程度降序排列的。因此,我们用一个数组记录最初排队的人(之后简称队列一),最前面的喝到了粥就把这个人对应的元素从开头删除,用另一个优先队列(之后简称队列二),比如 priority_queue,记录至少喝过一轮之后,重新进入队伍的人。枚举每一分,分别维护,即可求出答案。

具体的,我们需要定义一个结构体 {ys,wh,sm},三个元素分别表示这个人的优先程度进入队伍的时间以及喝一碗粥需要用到的时间。队列二的排序依据如下。第一关键字: ys越好;第二关键字: wh越好;第三关键字: sm越好。之后维护一个对于元素 ys后缀最大值,也就是从某个点往后最大的一个优先程度。接下来枚举每一分钟,对于每一分钟,如果如果队列二为空或者它里面最好的一个的 ys 不如队列一种剩余的最大的一个 ys 大(这里用后缀最大值统计),我们就选择把队列一的第一个元素加入一个插入清单,并把它删除,否则就把队列二最好的元素加入清单,并把它删除。这里,它们的插入时间都是最初的 wh 加上对应的 sm。对于这个清单,我们根据它的出入时间为关键字进行排序,每次将插入时间为当前时间的插入到队列二中,并将这个信息从清单中删除。清单用 set 实现。

最后如果队列一被彻底清空了,答案就是它被清空的那一个时间,否则为 -1

注意以下几点:

不要忘记判断 -1

注意记录的是“它被清空的那一个时间”还是它被清空的下一个时间;

多则数据不能不清空。

最后的最后,代码走起!

#include<bits/stdc++.h>
#define N 220000
using namespace std;
int t,n,d,k[N],s[N];
struct Student{
	int ys,wh,sm;
	bool operator<(Student ot)const{
		if(ys==ot.ys){
			if(wh==ot.wh)return sm>ot.sm;
			return wh>ot.wh;
		}
		return ys<ot.ys;
	}
};
Student stu[N];
int maxh[N];
priority_queue<Student>bef;
set<pair<int,Student>>ps;
int main(){
	scanf("%d",&t);
	while(t--){
		scanf("%d%d",&n,&d);
		for(int i=1;i<=n;i++)scanf("%d%d",&k[i],&s[i]),stu[i]={k[i],-1,s[i]};
		maxh[n]=stu[n].ys;
		for(int i=n-1;i>=1;i--)maxh[i]=max(maxh[i+1],stu[i].ys);
		while(bef.empty()==false)bef.pop();
		ps.clear();
		int tmp=0,i;
		for(i=1;i<=d&&tmp+1<=n;i++){
			if(bef.empty()==true||bef.top().ys<=maxh[tmp+1]){
				tmp++;
				ps.insert({i+stu[tmp].sm,{stu[tmp].ys,i+stu[tmp].sm,stu[tmp].sm}});
			}else{
				ps.insert({i+bef.top().sm,{bef.top().ys,i+bef.top().sm,bef.top().sm}});
				bef.pop();
			}
			while(ps.empty()==false&&ps.begin()->first==i){
				bef.push(ps.begin()->second);
				ps.erase(ps.begin());
			}
		}
		if(tmp==n)printf("%d\n",i-1);
		else printf("-1\n");
	}
	return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/555370.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

学习笔记------约束的管理

此篇记录FPGA的静态时序分析&#xff0c;在学习FPGA的过程中&#xff0c;越发觉得对于时序约束只是懂了个皮毛。现在记录一下自己的学习过程。 本文摘自《VIVADO从此开始》高亚军 为什么要进行约束&#xff1f;约束的目的是什么&#xff1f; 简单来说&#xff0c;就是需要在…

Unity(MVC思想)

MVC 一下演示使用MVC和不使用MVC的做法区别。 前两个没有使用MVC 主面板逻辑&#xff1a; mainPanel是该脚本名字 每个场景中不一定存在该面板&#xff0c;单纯的显隐需要去手动挂载过于麻烦。 所以自己读取创建面板出来(每个场景仅创建一次)&#xff0c;存下该面板&#xf…

OpenHarmony网络请求库-httpclient

简介 HTTP是现代应用程序通过网络交换数据和媒体的的主要方式。httpclient是OpenHarmony 里一个高效执行的HTTP客户端&#xff0c;使用它可使您的内容加载更快&#xff0c;并节省您的流量。httpclient以人们耳熟能详的OKHTTP为基础&#xff0c;整合android-async-http&#xf…

FPGA核心板在声呐系统中的应用

前言 声纳系统使用声脉冲来探测、识别和跟踪水下物体。一个完整的声纳系统是由一个控制和显示部件、一个发射器电路、一个接收器电路和同时能作为发射装置&#xff08;扬声器&#xff09;和探测装置&#xff08;高灵敏度麦克风&#xff09;的传感器组成。 声纳系统图 技术挑战…

list基础知识

list 1.list 的定义和结构 list 是双向链表&#xff0c;是C的容器模板&#xff0c;其接收两个参数&#xff0c;即 list(a,b) 其中 a 表示指定容器中存储的数据类型&#xff0c;b 表示用于分配器内存的分配器类型&#xff0c;默认为 list <int>; list 的特点&#xff1a;…

鸿蒙开发岗突增!它和前端开发到底有哪些区别和联系?

2024年1 月 18 日&#xff0c;鸿蒙 Next 预览版面向开发者正式开放申请。至此&#xff0c;鸿蒙原生应用版图已成型&#xff0c;这个中国自主研发的操作系统&#xff0c;正式走上了独立之路。 有许多的公司都陆续地加入了鸿蒙原生应用开发的队列&#xff0c;从年初宣布的200个应…

MySQL高负载排查方法最佳实践(15/16)

高负载排查方法 CPU占用率过高问题排查 使用mpstat查看cpu使用情况。 # mpstat 是一款 CPU 性能指标实时展示工具 # 能展示每个 CPU 核的资源视情况&#xff0c;同时还能将资源使用情况进行汇总展示 # 如果CPU0 的 %idle 已经为 0 &#xff0c;说明此核已经非常繁忙# 打印所…

京西商城——前端项目的创建以及前后端联调

创建VUE项目 在jingxi_shop_project文件夹中再创建一个 frontend 文件夹用来存放前端项目 /jingxi_shop_project/backend/jingxi_shop_project....../frontend/jingxi_shop_web......首先要安装 node.js 和 VUE cli&#xff0c;进入到项目目录内创建项目 vue create jingxi_…

【JavaEE多线程】Thread类及其常见方法(上)

系列文章目录 &#x1f308;座右铭&#x1f308;&#xff1a;人的一生这么长、你凭什么用短短的几年去衡量自己的一生&#xff01; &#x1f495;个人主页:清灵白羽 漾情天殇_计算机底层原理,深度解析C,自顶向下看Java-CSDN博客 ❤️相关文章❤️&#xff1a;清灵白羽 漾情天…

类和对象(中)(构造函数、析构函数和拷贝构造函数)

1.类的六个默认成员函数 任何类在什么都不写时&#xff0c;编译器会自动生成以下6个默认成员函数。 //空类 class Date{}; 默认成员函数&#xff1a;用户没有显示实现&#xff0c;编译器会自动生成的成员函数称为默认成员函数 2.构造函数 构造函数 是一个 特殊的成员函数&a…

接口自动化入门: Http请求的域名与IP地址概念!

在进行接口自动化测试时&#xff0c;经常需要与服务器进行通信&#xff0c;这就涉及到了使用Http协议发送请求。在发送请求时&#xff0c;我们需要指定目标服务器的域名或者IP地址。下面将从0到1详细介绍域名与IP地址的概念及其在接口自动化测试中的应用。 本文从5个方面来书写…

3D可视化技术:研发基地的科技新篇章

在科技日新月异的今天&#xff0c;我们生活在一个充满无限可能性的时代。而在这个时代中&#xff0c;3D可视化技术正以其独特的魅力&#xff0c;引领着科技领域的新一轮变革。 3D可视化技术通过三维图像的方式&#xff0c;将现实世界或虚拟世界中的物体、场景等以立体、逼真的形…

改进下记录学习的小网站

Strong改进 结束&#xff1a;2024-4-14 打算投入&#xff1a;10h 实际消耗&#xff1a;12h 3m 学习总是不在状态。 我的时间花得很零散&#xff0c;也有点茫然。所以想尝试一下集中式地、一块一块地花&#xff0c;比如投入30个小时&#xff0c;去干一件事&#xff0c;这样就可…

npm怎么迁移到pnpm

下载的vue3模板用到了pnpm&#xff0c;就安装了一下 但是安装之后使用pnpm install 就发现包全被移动到ignored文件夹下面了,还报错 PS G:\Projects\gitProeject\TS_front> pnpm installWARN  Moving commitlint/config-conventional that was installed by a different …

继电器会不会被淘汰?

继电器作为一种电控制器件&#xff0c;其基本功能是在输入量达到一定条件时&#xff0c;使电气输出电路中的被控量发生预定的阶跃变化。 尽管现代电子技术发展迅速&#xff0c;新型产品不断涌现&#xff0c;但继电器因其独特的优势在许多应用领域仍然不可替代。 技术优势&#…

git 删除本地分支 删除远程仓库中的分支

语法&#xff1a; 删除本地分支 git branch -D <分支名>删除远程分支 git push <remote名称> <分支名> --delete 示例&#xff1a; 删除本地分支 git branch -D feature/test_listview删除远程分支 git push origin feature/test_listview --delete 两个…

FebHost:谁可以注册.CA加拿大域名?

在加拿大&#xff0c;互联网域名的注册管理遵循一套独特的规则。特别是对于代表加拿大身份的顶级域名“.ca”&#xff0c;其申请和注册过程涉及一些严格的条件。这些条件确保了只有符合特定标准的个人或实体才能获得这一具有国家象征意义的网络地址。 首先&#xff0c;想要注册…

实战1-批量爬取百度图片(上)

任务需求&#xff1a;输入关键字下载100个图片保存到本地&#xff0c;每个关键字单独存放一个文件夹&#xff08;GUI版&#xff09; 任务描述&#xff1a;当输入关键字时会爬取100个与关键词有关的图片到本地每个关键词单独保存到一个文件夹中&#xff0c;比如说我输入黑客下载…

Arduino源代码(ino)在Proteus中调试总结

一、前言 基于BluePill Plus开发板&#xff08;该板是毕设网红板&#xff09; BluePill Plus / WeAct Studio 微行工作室 出品 BluePill-Plus/README-zh.md at master WeActStudio/BluePill-Plus GitHub 首页-WeAct Studio-淘宝网 (taobao.com) 在Proteus中对应的例子是&…

windows下安装kibana

下载&#xff1a;https://www.elastic.co/cn/downloads/kibana 安装&#xff1a;https://www.elastic.co/guide/cn/kibana/current/install.html 安装好后&#xff0c;cd到kibana的bin目录&#xff0c;启动kibana.bat 然后访问localhost:5601