[洛谷]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
*/

 

發佈了347 篇原創文章 · 獲贊 35 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章