题解:P12396 「FAOI-R9」平民上篮
ZackofZHOU · · 题解
思路
- 处理已知的操作。
- 进行结束考试的判定。
- 处理后续操作
- 判断是否回来了,没有回来就先投一个球。
- 接下来就来回投球
- 对于投球操作,取失败 3 次(对应操作
W)和一发投进(对应操作A)花费时间的最小值,即\min(3 \times c,b) 。
AC记录
完整代码:(有注释)
#include<iostream>
using namespace std;
string op;
int a,b,c,fail,cnt,ans;
bool back;
int main()
{
cin >> a >> b >> c >> op;
// 计算已经给定的动作的进球数以及失败
for(char x : op)
{
switch(x)
{
case 'G':
ans += a;
back = false;
break;
case 'B':
ans += a;
back = true;
if(fail == 3) // 计算失败->成功
cnt++;
fail = 0;
break;
case 'A':
fail = 3;
ans += b;
break;
case 'W':
ans += c;
fail = min(fail + 1,3);
break;
}
}
if(cnt >= 4) // 投完辣
{
cout << ans + (back ? 0 : a);
return 0;
}
if(!back) // 没回来, 肯定先投个球, 回来
{
ans += min((3 - fail) * c,b) + a;
cnt++;
}
// 来回投球
ans += (4 - cnt) * (2 * a + min(3 * c,b));
cout << ans;
return 0;
}
无注释版本:
#include<iostream>
using namespace std;
string op;
int a,b,c,fail,cnt,ans;
bool back;
int main()
{
cin >> a >> b >> c >> op;
for(char x : op)
{
switch(x)
{
case 'G':
ans += a;
back = false;
break;
case 'B':
ans += a;
back = true;
if(fail == 3)
cnt++;
fail = 0;
break;
case 'A':
fail = 3;
ans += b;
break;
case 'W':
ans += c;
fail = min(fail + 1,3);
break;
}
}
if(cnt >= 4)
{
cout << ans + (back ? 0 : a);
return 0;
}
if(!back)
{
ans += min((3 - fail) * c,b) + a;
cnt++;
}
ans += (4 - cnt) * (2 * a + min(3 * c,b));
cout << ans;
return 0;
}
蒟蒻第一次写题解,有解释错误请大佬私信。