分宿舍(暴力枚举)

“那天TA说TA要来,于是我就来啦。
那天我说我要来,于是你就来啦。
TA看到了什么?
你又看到了什么?
我看到你们在一起,我是真的很happy:)
太阳在哪里啊?
就在早上七八点。
太阳在哪里啊?
就在云的栖息地!”
——2050主题曲


2050的线下活动吸引了很多心怀梦想的年轻人。

小伙们打算组团去参加。他们一共有 n+m+2k 个人,包括 n+k 个男生,m+k 个女生,其中 k 对男女生为异性情侣,现在他们要找房间住。房间有三种类型,双人间 a 元一间,三人间 b 元一间,这两种只能同性一起住。情侣间能住一对异性情侣,一间 c 元。除了情侣间以外,其他房间都可以不住满。

求最少花多少钱,能让小伙伴们都有地方住。

Input

第一行一个整数 T (1≤T≤50) 表示数据组数。

接下来 T 组数据,每组数据一行 6 个整数 n,m,k,a,b,c,其中 0≤n,m,k≤103,0≤a,b,c≤109。

Output

对于每组数据输出一行一个数,表示所有人住下来所需要的最小花费。

Sample Input


 

2 3 0 1 1 3 3 3 3 2 1 6 2

Sample Output


 

3 6

有很多种情况需要考虑 就是需要的情侣间个数是不确定的

因此我们只要枚举情侣间的个数

再对其进行分类讨论 取最优解即可

#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <map>
#include <set>
#include <string>
#include <queue>
#include <stack>
#include <algorithm>
#include <iostream>
using namespace std;
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        long long n,m,k,a,b,c;
        scanf("%lld%lld%lld%lld%lld%lld",&n,&m,&k,&a,&b,&c);
        long long  temp1;
        long long  temp2;
        long long  MIN=1e18;
        long long  sum=0;
        for(long long  i=0;i<=k;i++)//i qinglv
        {
            sum=0;
            long long tmpm=1e18;
            sum+=i*c;
            temp1=n+k-i;
            temp2=m+k-i;
            //nan
            if(temp1%3==0)
            {
                tmpm=min(tmpm,temp1/3*b);
            }
            if(temp1%3==1)
            {
                tmpm=min(tmpm,max(temp1/3-1,1ll*0)*b+2*a);
                tmpm=min(tmpm,(temp1/3+1)*b);
            }
            if(temp1%3==2)
            {
                tmpm=min(tmpm,(temp1/3)*b+a);
                tmpm=min(tmpm,(temp1/3+1)*b);
            }
            if(temp1%2==1)
            {
                tmpm=min(tmpm,(temp1/2+1)*a);
                tmpm=min(tmpm,max(temp1/2-1,1ll*0)*a+b);
            }
            if(temp1%2==0)
            {
                tmpm=min(tmpm,(temp1/2)*a);
            }
            //tmpm=max(1ll*0,tmpm);
            //cout<<tmpm;
            sum+=tmpm;
            tmpm=1e18;
            //nv
            if(temp2%3==0)
            {
                tmpm=min(tmpm,temp2/3*b);
            }
            if(temp2%3==1)
            {
                tmpm=min(tmpm,max((temp2/3-1)*b,1ll*0)+2*a);
                tmpm=min(tmpm,(temp2/3+1)*b);
            }
            if(temp2%3==2)
            {
                tmpm=min(tmpm,(temp2/3)*b+a);
                tmpm=min(tmpm,(temp2/3+1)*b);
            }
            if(temp2%2==1)
            {
                tmpm=min(tmpm,(temp2/2+1)*a);
                tmpm=min(tmpm,max(temp2/2-1,1ll*0)*a+b);
            }
            if(temp2%2==0)
            {
                tmpm=min(tmpm,(temp2/2)*a);
            }
            //tmpm=max(1ll*0,tmpm);
            sum+=tmpm;
            //cout<<tmpm<<endl;
            MIN=min(MIN,sum);
        }
        printf("%lld
",MIN);
    }
}
原文地址:https://www.cnblogs.com/caowenbo/p/11852290.html