1 条题解

  • 0
    @ 2025-8-24 23:15:13

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar ZackofZHOU
    florr玩家,名字相同 || 临时主页 https://www.luogu.me/article/d6e76yr5

    搬运于2025-08-24 23:15:13,当前版本为作者最后更新于2025-05-07 17:22:33,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    思路

    1. 处理已知的操作
    2. 进行结束考试的判定。
    3. 处理后续操作
    • 判断是否回来了,没有回来就先投一个球
    • 接下来就来回投球
    • 对于投球操作,取失败 3 次(对应操作 W )和一发投进(对应操作 A )花费时间的最小值,即 min(3×c,b)\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;
    }
    

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

    • 1

    信息

    ID
    11736
    时间
    1000ms
    内存
    512MiB
    难度
    2
    标签
    递交数
    0
    已通过
    0
    上传者