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