【C++】牛客——春游

✨题目链接:春游

✨题目描述

盼望着,盼望着,东风来了,春天脚步近了。

值此大好春光,老师组织了同学们出去划船,划船项目收费如下:

双人船最多坐两人,也可以坐一人,收费a元

三人船最多坐三人,也可以坐两人或者一人,收费b元

本次出游加上带队老师共n人,如何安排能使得花费最小呢?

✨输入描述:

第一行给出一个正整数 𝑇(1≤𝑇≤1000) ,代表测试数据的组数。

接下来 T 行每行给出三个正整数𝑛,𝑎,𝑏,1≤𝑛,𝑎,𝑏≤10^9 ,含义如题。

✨输出描述:

每组输入输出一行,代表最小的花费

✨示例1

📍输入

2
2 20 200
3 20 20

📍输出

20
20

✨解题思路

首先我们可以计算双人船和三人船中每个玩家的花费,我们要在尽可能的情况下选择单价少的船优先安排。

利用 一点小学数学知识思考一下:

如果 3 a ​ ≤ 2 b 3a ​≤ 2b 3a2b
说明我们要先尽可能安排双人船坐满,
如果恰n%2==0,那就不需要额外安排船,
如果剩下一个人,那么就考虑是给他新添一艘船或者拿掉一个a,和之前2个人一起去坐3人船。
如果 3 a > 2 b 3a>2b 3a>2b
说明我们要先尽可能安排三人船坐满,那么与上面类似,我们可能留下
0,1,2三种情况,然后比较取最值。

✨代码

#include <iostream>
using namespace std;
typedef long long ll;
int main() {
    ll t,n,a,b;
    cin>>t;
    while(t--)
    {
        ll ret=0;
        cin>>n>>a>>b;
        if (n <= 2) {
        cout<<min(a, b)<<endl;
        }
        else if(3*a<=2*b)//双人坐满
        {
            ret=n/2*a;
            if(n%2!=0)
            {
                //剩一个人
                //要么多坐一个a or b
                //要么和另外两个去掉一个a一起坐一个b
                ret=min(ret+min(a,b),ret-a+b);
            }
            cout<<ret<<endl;
        }
        else
        {
            //三人坐满
            ret=n/3*b;
            if(n%3==1)
            {
                //剩一个
                //多一个a  or  多一个b or 少一个b多2a
                ret=min(ret+min(a,b),ret-b+2*a);

            }
            else if(n%3==2)
            {
                //剩两个
                //多一个a or 多一个b or 少一个b多3a 
                ret=min(ret+min(a,b),ret-b+3*a);
                
            }
            cout<<ret<<endl;
        }
    }
    return 0;
}


※ 如果文章对你有帮助的话,可以点赞收藏!!谢谢支持

  • 34
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一岁就可帅-

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值