终于到了假期了,老是决定带领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;
}