题解:P12396 「FAOI-R9」平民上篮

· · 题解

思路

  1. 处理已知的操作
  2. 进行结束考试的判定。
  3. 处理后续操作
    • 判断是否回来了,没有回来就先投一个球
    • 接下来就来回投球
    • 对于投球操作,取失败 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;
}

蒟蒻第一次写题解,有解释错误请大佬私信。