题意:1-6,6个数字分别代表六个事件:1.车速变为s、2.超车、3.接下来路段限速为s、4.允许超车、5.不限速、6.不允许超车,求最少有几个路牌没有看到
题解:可能导致违规有三个操作:1、超车,2、改变速度,3、新限速牌
因超车忽略的标示牌的个数就是在当前位置前到允许超车的标志牌间的不允许超车的标志牌个数,用cnt来记录,每次遇到不允许超车路牌cnt++否则cnt清零。
每次改变速度时要判断是否超过上一个路牌的速度限制,如果超过了则再判断上上个,直到没有限制路牌或路牌限制速度≥当前速度。该操作可以用栈来实现。
每次遇到新路牌要先与当前速度比较,再判断是否加入到栈。
#include<iostream>
#include<string.h>
#include<stdio.h>
#include<stack>
using namespace std;
int n,t,s,speed,cnt,ans;
int main()
{
while(scanf("%d",&n)!=EOF)
{
speed = cnt = ans = 0;
stack<int>st;
while(!st.empty()) st.pop();
for(int i=0;i<n;i++)
{
scanf("%d",&t);
switch (t)
{
case 1://车速到s
scanf("%d",&s);
speed = s;
while(!st.empty()&&st.top()<speed)
{
ans++;
st.pop();
}
break;
case 2://超车
ans+=cnt,cnt=0;
break;
case 3://限速为s
scanf("%d",&s);
if(speed>s)
ans++;
else
st.push(s);
break;
case 4://允许超车
cnt = 0;
break;
case 5://无限速
while(!st.empty()) st.pop();
break;
default://不允许超车
cnt++;
break;
}
}
printf("%d\n",ans);
}
return 0;
}