• CH Round #53 -密室


    描述

    有N个密室,3种钥匙(红色,绿色,白色)和2种锁(红色,绿色),红色钥匙只能开红色的锁,绿色钥匙只能开绿色的锁,白色钥匙可以开红色的锁和绿 色的锁,一把钥匙使用一次之后会被扔掉。每个密室由一扇门锁着,上面锁着一些红色和绿色的锁,房间里面放着一些红色、绿色和白色的钥匙,打开密室你将拿走 这些钥匙。你可以以任意顺序打开密室,但是同一个密室只能打开一次。初始你已经有了一些钥匙了,现在你要进行决策,使得最终剩下的钥匙尽量的多,注意,你 不一定要打开所有的房间,你可以在任意时刻结束。输出你最多能有几把钥匙。

    输入格式

    第一行一个整数N,表示有N个密室。
    第二行N个整数,第i个数表示第i扇门上有ai把红色的锁。
    第三行N个整数,第i个数表示第i扇门上有bi把绿色的锁。
    第四行N个整数,第i个数表示第i个密室有ci把红色的钥匙。
    第五行N个整数,第i个数表示第i个密室有di把绿色的钥匙。
    第六行N个整数,第i个数表示第i个密室有ei把白色的钥匙。
    第七行三个整数k0,k1,k2,依次表示初始你拥有的红色、绿色、白色钥匙的数量。

    输出格式

    输出一个整数,表示你最多能有几把钥匙。

    样例输入

    3
    1 2 3
    0 4 9
    0 0 10
    0 8 9
    1 0 8
    3 1 2
    

    样例输出

    8

    数据范围与约定

    • 对于40%的数据,满足N<=8。
    • 对于100%的数据,满足N<=14,0<=ai,bi,ci,di,ei,k0,k1,k2<=10。
    #include<iostream>
    #include<cstdio>
    
    using namespace std;
    
    inline int rd() {
        int ret=0,f=1;
        char c;
        while(c=getchar(),!isdigit(c))f=c=='-'?-1:1;
        while(isdigit(c))ret=ret*10+c-'0',c=getchar();
        return ret*f;
    }
    
    const int MAXN=16;
    
    int n;
    int glock[MAXN],rlock[MAXN];
    int gkey[MAXN],rkey[MAXN],wkey[MAXN];
    int gkey0,rkey0,wkey0;
    
    int f[1<<15][4];//red green white
    
    int main() {
        freopen("room.in","r",stdin);
        freopen("room.out","w",stdout);
        n=rd();
        for(int i=1; i<=n; i++) rlock[i-1]=rd();
        for(int i=1; i<=n; i++) glock[i-1]=rd();
        for(int i=1; i<=n; i++) rkey[i-1]=rd();
        for(int i=1; i<=n; i++) gkey[i-1]=rd();
        for(int i=1; i<=n; i++) wkey[i-1]=rd();
        rkey0=rd();
        gkey0=rd();
        wkey0=rd();
        f[0][0]=rkey0;
        f[0][1]=gkey0;
        f[0][2]=wkey0;
        int m=(1<<n)-1;
        int mx=0;
        for(int i=0; i<=m; i++) {
            for(int j=0; j<n; j++) {
                if((i&(1<<j))==0) {
                    int v=i|(1<<j);
                    int g=glock[j],r=rlock[j];
                    int kr=rkey[j],kg=gkey[j],kw=wkey[j];
                    int myr=f[i][0],myg=f[i][1],myw=f[i][2];
                    if(myr+myg+myw<g+r) {/*{f[v][0]=0;f[v][1]=0;f[v][2]=0;*/continue;}//%%%HSZ
                    if(myr>=r&&myg>=g) {
                        f[v][0]=f[i][0]-r+kr;
                        f[v][1]=f[i][1]-g+kg;
                        f[v][2]=f[i][2]+kw;
                    } else if((myr>=r&&myg+myw>=g)) {
                        f[v][0]=f[i][0]-r+kr;
                        f[v][1]=kg;
                        f[v][2]=f[i][2]-(g-myg)+kw;
                    } else if((myr+myw>=r&&myg>=g)) {
                        f[v][0]=kr;
                        f[v][1]=f[i][1]-g+kg;
                        f[v][2]=f[i][2]-(r-myr)+kw;
                    } else {
                        f[v][0]=kr;
                        f[v][1]=kg;
                        f[v][2]=f[i][2]-(g-myg)-(r-myr)+kw;
                    }
                }
            }
        }
        for(int i=0;i<=m;i++) mx=max(mx,f[i][0]+f[i][1]+f[i][2]);
        cout<<mx;
        return 0;
    }

    本文来自博客园,作者:GhostCai,转载请注明原文链接:https://www.cnblogs.com/ghostcai/p/9268618.html

  • 相关阅读:
    DSYMTools App Bug 分析工具
    Xcode dSYM 文件
    sqlserver数据库18456错误怎么解决?
    C#两个DataTable拷贝问题:该行已经属于另一个表的解决方法
    SNF微信公众号客户端演示-微信开发客户端能干什么
    sqlserver中创建链接服务器图解教程
    C#日期格式转换大全
    C#-MVC开发微信应用(8)--菜单管理的实现
    C#-MVC开发微信应用(7)--在管理系统中同步微信用户分组信息
    C#-MVC开发微信应用(6)--用户分组信息管理
  • 原文地址:https://www.cnblogs.com/ghostcai/p/9268618.html
Copyright © 2020-2023  润新知