7-4 房间 (30 分)

终于到了假期了,老师决定带领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. 优先判断当n<=2 时,这是我们只需要求得a,b间的最小值即可
  2. 当n>2时这是我们需要判断a/2,和b/2 的大小即判断两者的单价,选取最小者,这里的单间判断最好使用double来进行判断
  3. 当n/2<b/3时优先选择双人间,这是需要考虑当1、n为偶数是,全部选择双人间,2、当n为奇数时我们可以选择选择一个单人间或者退订一个双人间与另一个人选择一个三人间,即min(n/2 * a + a,(n/2 - 1) * a + b)。
  4. 当b/3<=a/2时这时我们优先选择三人间,当n%3==0时我们全部选择双人间刚好,否则我们需要判断1、当n%3=1时我们可以选择多加一个双人间或者多加一个三人间或者去掉一个三人间与多出来的一个人选择两个双人间。即min(min(n/3 * b + a,n/3 * b + b),(n/3-1)b+2a)2、当n%3=2时我们只需加一间双人间或者是一间三人间。

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

本来简单的一道题真是错误百出。吐了。

源码:

#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){
            ans[i]=min(a,b);
            continue;
        }
		double a1=1.0*a/2;
		double b1 = 1.0*b/3;
		if(a1>=b1){
			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{
			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
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值