合理分房间

终于到了假期了,老是决定带领ACM队员们出去游山玩水,计划出行两天,这样的话中间要找地方住一晚。恰巧,老师带领队员们来到了一所酒店,这所酒店只有双人间(最多住两人)和三人间(最多住三人),但是价格不同现在我们算上老师,一共n个人,酒店的双人间价格是a元,三人间价格是b元,现在老师想知道怎么样安排房间才能使开销最小,求最小开销?

输入格式:

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

接下来T行每行给出三个正整数n,a,b,1<=n,a,b<=10^9,含义如题。

输出格式:

输出包含T行,每行对应一组样例的输出。

输入样例:

2

2    20     200

3    20     20

输出样例:

20

20

题解代码:

注意:1、开辟数组的数量,2、比较单价是要用double进行比较,3、定义整数要用long long进行定义

方法一:不过这个过不了测试

#include <bits/stdc++.h> 
using namespace std;
long long int is_Fen(long long n,long long a,long long b)
{
    double x=a/2.0,y=b/3.0;
    if(x<y)//2人间 
    { 
        if (n%2==0)
        {
            return a*n/2;
        }else{
            return  min(a*(n/2+1),a*(n/2-1)+b);
        }           
    }else{//3人间 
        if(n%3==0)
        {
            return b*n/3;
        }else if(n%3==1){
             long long int temp=min(b*n/3+b,b*n/3+a);
             return min(temp,b*(n/3-1)+2*a);
        }else{
            return min(b*n/3+b,b*n/3+a);
        } 
    }
}
int main()
{   int t;
    cin>>t;
    while(t--)//0
    {
        long long int n,a,b;
        cin>>n>>a>>b;
        if (n<3)
        {
             cout<<min(a,b)<<"\n";
        }else{
             long long int m=is_Fen(n,a,b);
             cout<<m;
        }
    }
    return 0;
}

方法二:

#include<bits/stdc++.h>
using namespace std;
long long ans[1005];
int main(){
    int t;
    cin>>t;
    long long a,b,n;
    for(int i=1;i<=t;i++){
        cin>>n>>a>>b;
        if(n<=2)//至少2人间
        { 
            ans[i]=min(a,b);//返回数组中最小元素 
            continue;
        }
        double a1=1.0*a/2;
        double b1 = 1.0*b/3;
        if(a1>=b1)//3人间分配情况 
        {
            if(n%3==0)
            { 
                ans[i]=n/3*b;
            }else{
                if(n%3==1)
                {
                    ans[i]=min((n/3-1)*b+2*a,min(n/3 * b+a,n/3*b+b));
                }else{
                    ans[i]=min(n/3 * b+a,n/3*b+b);
                }
            }
        }else{//2人间分配情况 
            if(n%2==0)
            { 
                ans[i]=n/2*a;
            }else{
                ans[i]=min(min(n/2*a+a,n/2*a+b),(n/2-1)*a+b);
            } 
        }
        
    }
    for(int i=1;i<=t;i++)
        cout<<ans[i]<<endl;

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值