codeforces 845D Driving Test (模拟+思维)

传送门:codeforces 845D



题目大意:

驾考中有以下六种操作:

1.改变速度

2.超车

3.遇到限速标志

4.遇到可超车标志

5.遇到无限速标志

6.遇到禁止超车标志

驾考完后你可能存在若干违规行为,但是你可以告诉教练你没看到某些标志,请输出你没看到的最少的标志数,以使得你的行为不违规。



思路:

一开始这个题就理解错了,有 2 种行为,4种标志,只有你在做 2 种动作的时候才可能违规,但是某个动作是否违规不是往后看,而是往前看,看之前有多少个标志和你的动作相违背,直到找到一个允许你该动作的标志出现。这时候你可以说你看到了这个标志,而没看到之后的标志,所以你的动作不违规。



具体实现:

我们将超车之前的禁止超车标志数记录下来,把改变速度前遇到的限速标志记录下来,当进行这两种动作的时候往前找相矛盾的标志数加到结果中即可。当遇到可超车标志时就把禁止超车标志数清零,当遇到无限速标志时把限速标记列表清零。



代码:

#include<stdio.h>
#include<iostream>
#include<stack>
using namespace std;

int main()
{
	int i,n,x,y,num,ans,speed;
	stack<int> st; //保存限速标志的限制速度 
	while(~scanf("%d",&n))
	{
		ans=0;
		num=0;
		while(!st.empty()) st.pop();
		while(n--)
		{
			scanf("%d",&x);
			if(x==1)
			{//改变速度 
				scanf("%d",&speed);
				while(!st.empty()&&st.top()<speed)
				{ //往前找到第一个允许该速度的标志 
					ans++;
					st.pop();
				}
			}
			else if(x==2)
			{//超车
				ans+=num; //加上前面出现过的禁止超车标志数 
				num=0;
			}
			else if(x==3)
			{//限速
				scanf("%d",&y);
				if(y<speed) ans++; //如果该限速标志和当前速度矛盾 
				else st.push(y);
			}
			else if(x==4)
			{//可超车
				num=0;
			}
			else if(x==5)
			{//不限速 
				while(!st.empty()) st.pop();
			}
			else
			{//禁止超车 
				num++;
			}
		}
		printf("%d\n",ans);
	}
	return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值