您的位置:首页 > 其它

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

2018-02-12 09:01 344 查看
传送门: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;
4000
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: