CF-Round#623-div2-B题
B. Homecoming
最近写题有点力不从心了。。emmm。看个题目要看半天,集中不了注意力。。完蛋。
这道题是一道模拟题。
题目大意:主人公参加完一场聚会,需要回到家中,回去的路线有一些电车站台和公交车站台。其中在电车站台乘车会在第一个碰到公交车的站下车,在公交车站台乘车会在第一个碰到电车的站下车。其中乘公交车花费a,乘电车花费b。主人公身上有一些钱。问主人公最少需要走多少路才能有足够的钱回到家。输出需要走到站台的下标。
这里面有一个坑点。
我们下标为n的地方是不需要乘车的,也就是index = n的车站是没用的。
我们模拟只需要从后到前模拟即可。从n-1的地方开始。
只要我们到达了n-1的位置了,不管n的地方是A还是B。都可以到达或者超过。
模拟过程就是有钱的话就往前,没钱了就退出。挺好想的。
下标处理:如果跑完一遍了。i = 0,最后赋值为1
如果循环都没有进入或者说钱不够花就直接赋值为s字符串的长度。
我们首先可以判断一下。如果手中的钱连一个车费都不够,就直接输出长度。
下标处理的时候我又卡了。最近一老卡边界。。emm.一直在纠结s[0]的位置判断。于是就直接在前面加了一个’\0’
代码部分:
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
int a, b, p;
char s[N];
int main()
{
int t;
cin >> t;
while (t--)
{
int i;
int flag = 0;
cin >> a >> b >> p;
scanf ("%s", s + 1);
int n = strlen(s + 1);
s[0] = '\0';
if (a > p && b > p)
{
cout << n << endl;
continue;
}
for (i = n - 1; i > 0; i--)
{
if (s[i] == 'A')
{
if (a > p)
{
i++;
break;
}
}
else
{
if (b > p)
{
i++;
break;
}
}
if (s[i] != s[i - 1])
{
if (s[i] == 'A')
{
p -= a;
flag = 1;
}
else
{
p -= b;
flag = 1;
}
}
}
if (!i)
{
i = 1;
}
if (!flag)
{
i = n;
}
cout << i << endl;
}
return 0;
}