cf1239C (接热水)

我们月赛用这题弱化了数据改了到月赛题…我居然不会…
http://www.thesky341.top 可以进去看看,题目为接热水

这题其实相对于我以前写的模拟而言是比较容易的,那么为什么会卡勒,
1.对stl 不熟悉,居然忘记 set 找数是无敌的存在
2.对题目思路理不清,无法分清里面所包含的数据结构
不多说,
这题其实可以分为三种人,排队的人,未口渴的人,口渴坐着的人
分别就对应了一个队列,一个以编号小优先的优先队列,以及一个按谁先口渴谁先排好序的数组(口渴时间同则按编号小排)
此时共两中大情况
一种是有人在排队
有人在排队是先把这个人该处理的处理了,
然后在他接水时口渴的人一个个处理,口渴前面没人,加入排队,有人则加入醒来没去行列
一种是没有人在排队
那么肯定是让坐着口渴的人先去排
如果没有坐着的人在考虑现在口渴的人去排,注意这个时候可能会有一段时间没人排,所以记得更新 nowt (去排的时间)

具体代码如下

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MA = 1e5+5;
struct stu{
	int w,pos;
	bool operator < (const stu B) const{
    return this->pos > B.pos;
	}	//优先队列 醒来人位置优先 
}a[MA];//a[]为按醒来顺序一个个来!
priority_queue<stu> xinq; //醒来的在等的人 
queue<stu> q; //排队 先进先出 
set<int> s; //排队   有哪些人
ll ans[MA]; 
int comp(stu c, stu d)
{
	return c.w == d.w ? c.pos < d.pos : c.w < d.w;
} 
int main()
{
	int n,P;
	scanf("%d%d",&n,&P);
	for (int i = 0; i < n; i++)
	{
		scanf("%d",&a[i].w);
		a[i].pos = i;
	}
	sort(a,a+n,comp);
    ll	nowt = a[0].w;
	int p = 0; // nowt表示现在第几分钟 p表示现在醒了第几个 
	s.insert(n);  //至少留个数比较 
	while( p < n || !q.empty() || !xinq.empty() )
	{
		stu k;
		if(!q.empty()) //有人排队 
		{
			nowt += P;
			k = q.front(); q.pop();
			ans[k.pos] = nowt;  //把排第一个的事搞定 
			while(p < n && a[p].w <= nowt)//醒来的人何去何从 
			{
				int bian = *s.begin();//排队里面最小的编号
				if( a[p].pos < bian)
				{
					s.insert(a[p].pos);
					q.push(a[p++]);
				}
				else
				{
					xinq.push(a[p++]);
				}
			} 
			s.erase(k.pos);
		}
		else   //没人排队 
		{
			if(!xinq.empty()) //有人坐着 
			{
				k = xinq.top();
				xinq.pop();
			} 
			else  //没人坐着 
			{
				nowt = max(nowt,(ll)a[p].w);
				k = a[p++];
			}
				q.push(k);
				s.insert(k.pos);
		}
	} 
	for (int i = 0; i < n; i++)
	{
		if(!i) printf("%I64d",ans[i]);
		else   printf(" %I64d",ans[i]);
	} 
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值