D. Driving Test(贪心+栈)

说是模拟,其实更像贪心

如何清晰的处理超车和限速是关键

. \color{Red}Ⅰ.超车

, n o _ a l l o w + + 遇到不允许超车的牌子并不马上无视掉,而是让遍历no\_allow++

, n o _ a l l o w , 如果后续超车,就加上no\_allow,意思是无视掉之前所有超车牌

, n o _ a l l o w = 0 如果遇到允许超车,那么直接no\_allow=0

. \color{Red}Ⅱ.限速

s ? 遇到限速为s的牌子怎么办?

s , 一、当前速度已经大于s,必须无视

s , ? 二、当前速度小于等于s,无视吗?不一定的

, 不如暂时不无视,装进限速栈中

, 后续的速度超过限制时,就从栈中倒回去无视一些限速牌

#include <bits/stdc++.h>
using namespace std;
int n,ok,speed,ans,s;
stack<int>q;
int main()
{
	cin >> n;
	int limit=1e9,no_allow=0;//表示一开始无速度限制
	cin >> ok >> speed;//直接读取掉初始速度 
	for(int i=1;i<n;i++)
	{
		cin >> ok;
		if(ok==1)
		{
			cin >> s;
			while(!q.empty()&&s>limit)
			{
				q.pop(),ans++;
				if( q.empty() )	limit=1e9;//无视了所有限速牌 
				else limit=q.top();
			}
			speed=s;
		}
		else if(ok==2)
		{
			ans+=no_allow,no_allow=0;//无视掉前面的超车 
		}
		else if(ok==3)
		{
			cin >> s;
			if(speed>s)	ans++;//当前车速已经很快,直接无视 
			else limit=s,q.push(s);//暂时不无视,把限速的放进栈里面 
		}
		else if(ok==4)	no_allow=0;//允许超车了 
		else if(ok==5)
		{
			limit=1e9;
			while(!q.empty())	q.pop();
		}
		else	no_allow++;//不允许超车牌子数目 
	}
	cout<<ans;
}

猜你喜欢

转载自blog.csdn.net/jziwjxjd/article/details/107226181
今日推荐