数据结构最小开支问题

m个学生去旅行,晚上遇到了住房问题。已知双人房每间a元,三人房每间b元,在保证所有学生都有房间住的前提下,请你帮忙算一下他们的最小开支
输入
第一行是一个正整数n代表测试案例的数量。(1<=n<=50)
从第二行到第n+1行,每行有三个正整数m,a,b。(1<=m,a,b<=1e9)
输出
针对每组案例,输出他们的最小开支,然后换行

简单想了一下,看双人房和三人房的人均成本哪个高,成本低的优先住满。如果3人的便宜,那么3人房费用m/3 * b。然后看m%3的结果是1或者2。如果是2,正好双人房。如果是1,那么3人房要减去1间,这三个人和多余的1个人组两间双人房
如果双人房便宜,那么双人房费用m/2 * a,然后看m%2是0还是1,如果是1,则双人房减去1,和多余的人住三人房

#include <stdio.h>
int main()
{
    int n;
    scanf("%d",&n);
    for(int i=0;i<n;i++)
    {
        int m=0;
        double a,b,pay=0;
        scanf("%d%lf%lf",&m,&a,&b);
        if(a/2 > b/3) //双人间人均费用更高,优先住3人间
        {
            pay += m/3 * b;  //3人间费用
            if(m%3==1)  //如果多出来一个人,则减少一个3人间,加2个双人间
                pay += 2 * a - b;
            else if(m%3==2) //如果多出来2个人,正好住1个双人间
                pay += a;
        }
        else
        {
            pay += m/2 * a;   //优先住双人间
            if(m%2==1)   //如果多出来一个人,则减少一个双人间,加1个三人间
                pay += b-a;   
        }
        printf("%lf\n",pay);
    }
    return 0;
}

代码实现及解释如下,望采纳

#include <iostream>
using namespace std;

int main()
{
int n;
cin >> n;

for (int i = 0; i < n; i++)
{
    int m, a, b;
    cin >> m >> a >> b;

    // 从小到大枚举双人房的数量,计算最小开支
    int min_cost = 0x7fffffff;
    for (int j = 0; j <= m / 2; j++)
    {
        int cost = j * a + (m - j * 2) / 3 * b;
        min_cost = min(min_cost, cost);
    }
    cout << min_cost << endl;
}

return 0;
}

代码实现了从小到大枚举双人房的数量,然后计算最小开支,最后输出结果。注意,在计算三人房的数量时,需要使用整数除法(即 / 运算符),避免精度损失。