F - 法法要穿过大门
CodeForces - 935B
这一题不难,可是题目是老长老长的英文,而且还有一些我不懂的词,导致我理解题意就花了很长的时间。
题意:统计法法一共穿过y=x这条直线几次(第一次不算)。
观察:法法穿过y=x一定有这样一个条件:这次所在位置与上两步所处位置分别分布在y=x的上下两侧。
代码实现思路:易发现——在y=x的上测的点满足y>x,而在y=x下测的点满足y<x,在y=x上的点满足y=x。于是,我们只要把每个点相对y=x的位置都记录下来,最后遍历求出满足条件的点的个数即可。
代码:
#include<iostream> using namespace std; char s[100010]; int x[100010],y[100010],q[100010]; int main() { int n; cin>>n; int coin=0; cin>>s; for(int i=0;i<=n-1;i++) { y[i]+=y[i-1]; x[i]+=x[i-1]; if(s[i]=='U') y[i]++; else x[i]++; if(x[i]>y[i]) q[i]=2; else q[i]=3; if(x[i]!=y[i]&&x[i-1]==y[i-1]&&q[i]!=q[i-2]) coin++; } coin--; printf("%d",coin); }