[洛谷]P6013 压岁钱 (#模拟)

题目链接:https://www.luogu.com.cn/problem/P6013


思路

退役了,真的退役了......三个月没怎么刷题,div2的第一题就把我弄自闭了,写了半个小时,跑的还死慢。。不过我想只要是人都能看懂我这个代码,大体上就是硬核模拟。

#include <stdio.h>
#include <iostream>
#include <queue>
#define int long long int
#define N 1000001
using namespace std;
struct node//并没有什么卵用的结构体,事实上在后面的读入中只需要3个变量。 
{
	int id,val,to;//id:事件;val:得到或花掉的钱;to:仅事件3才有的参数[持续到第几天] 
}a[N];
struct lst//这个结构体处理专门一系列的事件三 
{
	int duration,v;//duration代表封印持续到第几天,v代表封印的钱 
	bool operator < (const lst &a)const
	{
		return a.duration<duration;//把持续时间从小到达排序 
	}
}tmp;
int n,s,ans,f;
priority_queue<lst> q;//优先队列 
signed main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	register int i,j;
	cin>>n;
	for(i=1;i<=n;i++)//枚举事件i 
	{
		while(!q.empty())
		{
			if(q.top().duration==i)//判断某个事件3的持续时间是否已经到了i 
			{
				s=s+q.top().v;//把钱拿回来 
				q.pop();//踢掉 
			}
			else break;//如果不是就不管 
		}
		cin>>a[i].id;//输入事件类型 
		if(a[i].id!=3)//如果不是3 
		{
			cin>>a[i].val;
			if(a[i].id==1)
			{
				s+=a[i].val;//直接赚钱即可 
			}
			else//事件2 
			{
				s-=a[i].val;//花钱 
				if(s<0)//如果没有足够的钱 
				{
					s+=a[i].val;//再加回来 
					ans++;//不满意的次数+1 
				}
			}
		}
		else//事件3 
		{
			cin>>a[i].val>>a[i].to;
			s-=a[i].val;//减钱 
			tmp.duration=a[i].to; 
			tmp.v=a[i].val;
			q.push(tmp);//塞进队列 
		}
		//cout<<s<<endl<<endl;
	}
	cout<<ans<<endl;
	return 0;
}
/*
10
1 20
3 5 9
2 20
3 5 6
1 10
2 20
1 15
3 5 9
2 20
2 15

2
*/

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值