hdu6492 暴力预处理 + 枚举

http://acm.hdu.edu.cn/showproblem.php?pid=6492

题意

他们一共有 n+m+2k 个人,包括 n+k 个男生,m+k 个女生,其中 k 对男女生为异性情侣,现在他们要找房间住。房间有三种类型,双人间 a 元一间,三人间 b 元一间,这两种只能同性一起住。情侣间能住一对异性情侣,一间 c 元。除了情侣间以外,其他房间都可以不住满。
求最少花多少钱,能让小伙伴们都有地方住。((n,m,k leq 10^3))

题解

  • 把人分成三部分,男同性,女同性,情侣,因为情侣间不能空,所以一定是枚举情侣间数,然后剩下的住同性,所以本质上来说处理男同女同是一样的
  • 暴力预处理出i个同性所需要的最小花费,枚举情侣间维护最小费用

代码

#include<bits/stdc++.h>
#define inf 1e18
#define ll long long 
using namespace std;
ll n,m,k,a,b,c,Mi[4005],ans;
int T;
int main(){
    cin>>T;
    while(T--){
        ans=inf;
        scanf("%lld%lld%lld%lld%lld%lld",&n,&m,&k,&a,&b,&c);
        for(int i=0;i<=n+m+k;i++)Mi[i]=inf;
        for(ll i=0;i<=n+m+k;i++){
            for(ll j=0;j<=i/2+1;j++){
                if(j*2>=i)Mi[i]=min(Mi[i],j*a);
                else{
                    ll lt=i-j*2;
                    if(lt%3==0)Mi[i]=min(Mi[i],j*a+lt/3*b);
                    else Mi[i]=min(Mi[i],j*a+(lt/3+1)*b);
                }
            }
        }
        for(ll i=0;i<=k;i++){
            ans=min(ans,Mi[n+k-i]+Mi[m+k-i]+i*c);
        }
        printf("%lld
",ans);
    }
}
原文地址:https://www.cnblogs.com/VIrtu0s0/p/10815604.html