hdu 6006 Engineer Assignment(状压dp)

华为设备有关用户名密码的策略配置 命令用来开启对密码进行复杂度检查功能,设备默认已经是开启状态。1、密码长度大于等于12位,含数字大小写字母和特殊符号。2、设置密码更换周期为90天。取值范围8-16,默认长度为8位。登录失败后锁定时间大于15分钟。3、登录失败次数小于5次。4、登录超时30分钟以内。 阅读详情

题目链接

Problem Description

In Google, there are many experts of different areas. For example, MapReduce experts, Bigtable experts, SQL experts, etc. Directors need to properly assign experts to various projects in order to make the projects going smoothly.
There are N projects owned by a director. For the ith project, it needs Ci different areas of experts, ai,0,ai,1,⋅⋅⋅,ai,Ci−1 respective. There are M engineers reporting to the director. For the ith engineer, he is an expert of Di different areas, bi,0,bi,1,…,bi,Di−1.
Each engineer can only be assigned to one project and the director can assign several engineers to a project. A project can only be finished successfully if the engineers expert areas covers the project areas, which means, for each necessary area of the project, there is at least one engineer
masters it.
The director wants to know how many projects can be successfully finished.

Input

The first line of the input gives the number of test cases, T. T test cases follow. Each test case starts with a line consisting of 2 integers, N the number of projects and M the number of engineers. Then N lines follow. The ith line containing the information of the ith project starts
with an integer Ci then Ci integers follow, ai,0,ai,1,…,ai,Ci−1 representing the expert areas needed for the ith project. Then another M lines follow. The ith line containing the information of the ith engineer starts with an integer Di then Di integers follow, bi,0,bi,1,…,bi,Di−1 representing the expert areas mastered by ith engineer.

Output

For each test case, output one line containing “Case #x: y”, where x is the test case number (starting from 1) and y is the maximum number of projects can be successfully finished.
limits

∙1≤T≤100.
∙1≤N,M≤10.
∙1≤Ci≤3.
∙1≤Di≤2.
∙1≤ai,j,bi,j≤100.

Sample Input

1
3 4
3 40 77 64
3 10 40 20
3 40 20 77
2 40 77
2 77 64
2 40 10
2 20 77

Sample Output

Case #1: 2

Hint

For the first test case, there are 3 projects and 4 engineers. One of the optimal solution is to assign the first(40 77) and second engineer(77 64) to project 1, which could cover the necessary areas 40, 77, 64. Assign the third(40 10) and forth(20 77) engineer to project 2, which could cover the necessary areas 10, 40, 20. There are other solutions, but none of them can finish all 3 projects.
So the answer is 2.

以后学乖了,看到这么小的数据量还是先去想状压吧……

比赛的时候其实后来想到了状压的方法,但是到了后面
时间也不多了,思路也还没有那么清晰,再加上代码比较挫,没有写出来。

大致的思路就是:首先进行预处理,把每个工程师选与不选压缩成一个状态,然后用一个vector数组存储完成每个任务工程师的状态集合。
dp[i][s]代表前i个任务,状态为s时,最多完成的任务数。
具体递推关系可以看代码。

预处理是这道题稍微复杂一点的地方,但其实思路清晰之后也很好写,之前用了map,但是一直t,后来用数组重写了,但可能不是map的锅(也有可能是我写挫了),毕竟最后过的时间还是很快的。
一定要记得初始化!

#include<iostream>
#include<queue>
#include<cstdio>
#include<cstring>
#include<string>
#include <cmath>
#include <map>
#include <set>
#include <vector>
#include <iterator>
using namespace std;
const double eps = 1e-6;
const double pi = acos(-1.0);
const int INF = 0x3f3f3f3f;
#define ll long long
#define CL(a) memset(a,0,sizeof(a))

vector<int> a[20];
int d[20][10],c[20][10];
int p[120];
int dp[20][1<<11];
int main()
{
    int t,n,m;
    cin>>t;
    int cas=0;
    while(t--)
    {
        cin>>n>>m;
        memset(c,0,sizeof(c));
        memset(d,0,sizeof(d));
        memset(p,0,sizeof(p));
        memset(dp,0,sizeof(dp));
        for(int i=1;i<=n;i++)
        {
            a[i].clear();
        }
       for(int i=1;i<=n;i++)
       {
           cin>>c[i][0];
           for(int j=1;j<=c[i][0];j++)
           {
               cin>>c[i][j];
           }
       }
       for(int i=0;i<m;i++)
       {
           cin>>d[i][0];
           for(int j=1;j<=d[i][0];j++)
           {
               cin>>d[i][j];
           }
       }
       for(int i=1;i<=n;i++)
       {
           for(int s=0;s<(1<<m);s++)
           {
               int cnt=0;
               memset(p,0,sizeof(p));
               for(int k=0;k<m;k++)
               {
                   if(s&(1<<k))
                   {
                       cnt++;
                       for(int j=1;j<=d[k][0];j++)
                        p[d[k][j]]=1;
                   }
               }
               if(cnt>3) continue;
               int flag=1;
               for(int j=1;j<=c[i][0];j++)
                if(p[c[i][j]]==0) flag=0;
               if(flag) a[i].push_back(s);
           }
       }
        for(int i=1; i<=n; i++)
        {
            for(int s=0; s<(1<<m); s++)
            {
                for(int j=0; j<a[i].size(); j++)
                {
                    if((s|a[i][j])==s)
                    {
                            dp[i][s]=max(dp[i-1][s-a[i][j]]+1,dp[i][s]);  //这里代表的是一定会完成第i个任务的情况。
                    }
                }
                dp[i][s]=max(dp[i][s],dp[i-1][s]);  //加上这句就表示可以不选用第i个任务
            }
        }
        printf("Case #%d: ",++cas);
        cout<<dp[n][(1<<m)-1]<<endl;
    }
    return 0;
}
告别OLE!Delphi操作Excel的3种轻量级方案横向评测(FlexCel/XLSReadWriteII/LibXL) 本文深入评测了Delphi操作Excel的三种轻量级方案:FlexCel、XLSReadWriteII和LibXL。通过技术架构、API设计、性能测试和实战案例的全面对比,帮助开发者选择最适合的工具,提升Excel文件处理效率,告别传统OLE方案的依赖和性能问题。 阅读详情

相关推荐

Autosar Davinci Configurator新建工程以及导入DBC和CDD

Autosar Davinci Configurator新建工程前言一、Autosar Davinci Configurator新建工程二、Autosar Davinci Configurator导入DBC和CDD1.引入库2.读入数据总结 前言 如何用 DavinciCFG 新建工程,以及导入DBC和CDD文件。 一、Autosar Davinci Configurator新建工程 示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。 二、Autosar Davinc

别再跑偏了的博客 1万+

HDU - 6006 Engineer Assignment (状压dfs)

题意:n个工作,m个人完成,每个工作有ci个阶段,一个人只能选择一种工作完成,可以不选,且只能完成该工作中与自身标号相同的工作阶段,问最多能完成几种工作。 分析: 1、如果一个工作中的某个工作阶段没有任何一个人能完成,则这个工作是不可完成的。 2、预处理每个人能完成各工作的各工作阶段。 3、剪枝:如果当前完成工作数+剩余人数<=ans则剪枝。 #include<...

Cherrychan2014的博客 217

【gridsample】地平线征程6芯片中gridsample算子的优化与部署实践

本文详细介绍了地平线征程6芯片中gridsample算子的优化与部署实践,重点探讨了PTQ和QAT量化方案在BEV感知任务中的应用。通过双线性插值优化、内存布局调整和混合精度配置等关键技术,显著提升了算子在自动驾驶场景下的性能和精度,为开发者提供了实用的部署指南和调优建议。

zero1的博客 1019

HDU6006 - (预处理+状压dp)

没写出来的原因多半是平时自己练太少了,其实很水的一个状压题解:预处理出每个地方可以有哪些人组合完成 dp[i][j]就表示前i个人在状态j的最大完成数量。#include <iostream> #include <cstring> #include <string> #include <algorithm> #include <cstdio> #include <cmath> #include <

yxmGo 1010

操作系统头歌 课后作业3.3.2:进程的调度

请问:从 6 号进程刚创建完 7 号进程开始,在接下来的 9 次进程调度中,每次调度时,6 号和 7 号进程的剩余时间片是多少?请问:从 6 号进程刚创建完 7 号进程开始,在接下来的 9 次进程调度中,每次调度时,6 号和 7 号进程的剩余时间片是多少?根据相关知识回答当程序 01.c 运行时(在版本 0 内核中),会在父子两个进程(假设分别为 6 号和 7 号进程)中分别输出字符串。当程序 01.c 运行时(在版本 0 内核中),会在父子两个进程(假设分别为 6 号和 7 号进程)中分别输出字符串。

weixin_73255571的博客 4703

Win11 24H2家庭版共享打印机失败?别慌,一个批处理脚本搞定所有设置

本文提供了Win11 24H2家庭版共享打印机失败的解决方案,通过一个批处理脚本自动修复所有设置问题。脚本包含安装组策略组件、修改关键注册表项等操作,帮助用户快速恢复打印机共享功能,适用于普通家庭用户。

weixin_30632089的博客 418

HDU 6006 Engineer Assignment (状态压缩DP)

/* 一共有N个工作,M个人。每个工作需要某些领域的知识,每个人都有自己精通的领域。给这些工作分配人,要求每个人最多只能分配一项工作,每个工作的若干人所精通的知识必须包含了该工作的知识, 问最多能分配几个工作。 将人的集合表示成二进制 dp[i][S]表示前i个工作,选的人的集合为S时,所完成任务的最大数量 则有dp[i][S] = max( dp[i-1][S], dp

Interstellar_的博客 478

CCS20实战入门:第一个工程搭建示例

通过实际操作演示如何在ccs20中创建并配置首个开发项目,涵盖环境设置与基础调试步骤,帮助新手快速上手ccs20集成开发环境,提升嵌入式开发效率。

weixin_31185473的博客 884

H - Engineer Assignment HDU - 6006状压

题目大意: 有n个任务,每个任务有一些要求,有m个人,每个人可以解决一些要求,问你,最多可以完成多少任务。 分析: 由于n和m很小,我们可以考虑状压DP,首先,预处理出来每个任务所需的人数组合,然后进行dp dp[i][j]=max(dp[i-1][j-t[i][k]]+1,dp[i][j]); dp[i][j]=max(dp[i][j],dp[i-1][j]); #include &lt;ios...

CURRYWANG97的博客 557

融合Retinex理论与Transformer的YOLOv8低光照目标检测增强方法【YOLOv8】

图像分解:将输入图像分解为光照成分和反射成分。光照估计:估计光照图以消除暗光区域。图像重建:将光照增强后的反射图像重建成最终图像。Retinexformer通过在Transformer中引入Retinex的图像增强思路,使得低光照图像的细节能够得到充分保留。本文提出了一种基于Retinexformer的低光照增强方法,用于改进YOLOv8模型在夜间和低光照环境下的目标检测性能。

博客 1929

Spring 核心技术解析【纯干货版】- I:Spring 基础模块 Spring-Core 模块精讲

Spring-Core 模块,是 Spring 核心容器模块之一。虽然 “Core” 本身就有 “核心的,重要的部分” 的含义,但是它并非是实现(常被我们说为 Spring 核心机制)IOC / AOP 的模块。Spring 中的 IOC 机制,主要来自于 BeanFactory 容器和 ApplicationContext 容器,这二者分别由同为核心容器模块的 Spring-Bean 模块 和 Spring-Context 模块所提供。

栗筝i的博客 2523

HDU 6006 状压DP

题意给最多10个任务,每个任务完成需要一些技能,给最多10个工程师,每个工程师拥有一些技能。每个工程师只能完成一项任务,问最多可以完成多少任务。题解看到数据量只有10就应该想到是状压DP的,对于这道题我们发现技能状态很多而拥有工程师的状态很少。(因为最多只有10个工程师)我们这时候就要意识到要对工程师进行处理。我们可以枚举一下对于每个任务,哪些工程师能解决问题,需要注意处理掉工程师数量大于3的状态(

zhenlingcn的博客 481

Unity 面试篇|(二)Unity基础篇 【全面总结 | 持续更新】

在主线程运行的同时开启另一段逻辑处理,来协助当前程序的执行,协程很像多线程,但是不是多线程,Unity的协程实在每帧结束之后去检测yield的条件是否满足。一个程序在运行(执行)的过程中所需要的硬件和软件环境运行时的主要作用是提供程序运行所需要的环境和基础设施,通过为程序提供内存分配、线程管理、类型检查、对象实例化和垃圾回收等操作来支持程序的运行公共语言运行时(Common Language Runtime,CLR)是整个.NET框架的核心,它为.NET应用程序提供了一个托管的代码执行环境。

游戏开发小Y的博客 13万+

hdu 6006 Engineer Assignment 2016 ccpc final (状压dp)

题目链接 https://vjudge.net/problem/HDU-6006 题目大意 有nnn个工程和mmm个人,每个工程需要几个方面的人才,一个人在某几个方面精通,问同时最多可以进行多少个工程 (一个人只能参与一个工程) 题解思路 这道题的数据范围很小,考虑状压dp 用dp[i][sta]dp[i][sta]dp[i][sta]表示进行到第iii个工程,用了stastasta状态的人的最大...

neuq_zsmj的博客 222

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

HDU - 6006 Engineer Assignment(状压dp)

题目链接 题意:有n个任务,完成这些任务需要一些领域的知识。有m个工程师,每个工程师都有一些自己会的领域。每个工程师只能选择一个任务,若参与这项任务的工程师具备了完成所需的所有知识,这项任务则被完成。问最多能完成几个任务。 题解:题目给的n和m都很小,所以想到了状压DP去实现。dp[i][j]表示前i个任务在使用工程师j状态下最多能完成的任务个数。在维护dp状态之前,要额外跑一遍来确定能完成第i个任务的方案,用于最后的状态转移。 #include <bits/stdc++.h> using na

SsteelXD的博客 240

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

HDU 6006 Engineer Assignment:状压dp

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6006 题意:   在Google中,有个n项目,m个专家。第i个项目涉及c[i]个领域,分别为a[i][0]...a[i][c[i]-1]。第i个专家精通d[i]个领域,分别为b[i][0]...b[i][d[i]-1]。   如果要完成一个项目,则这个项目所涉及到的每一个领域都必须至...

a1392136的博客 157

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

HDU - 6006 Engineer Assignment 状压DP

Engineer Assignment Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1484 Accepted Submission(s): 509 Problem Description In Google, there are...

darren0424的博客 195

hdu 6006 Engineer Assignment(状压DP)

Engineer Assignment Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 456    Accepted Submission(s): 149 Problem Description In Googl

MR CODER 426

hdu6006 Engineer Assignment 状压dp

hdu6006 题意:有 n 个工程, m 个人,每个工程需要 ci 个领域的知识,每个人精通 di 个领域。每个人只能去一个工程,问最多可完成多少个工程。 tags:数据范围小,状压 dp[i][j] 代表前 i 个工程在状态 j 的组合下,最多能完成多少个工程。 首先预处理出每个工程可由哪些人组合完成,用 0 ~ ((1<<m)-1)记录。这里有点麻烦。。 然后就是 ...

weixin_30627381的博客 127

HDU6006:Engineer Assignment(状压DP)

传送门 题意 给出n个工程,m个工程师,每个工程和工程师需要/拥有若干个技能,询问能够完成的最大工程个数,每个工程师用一次 分析 dp[i][j]表示前i个工程用的工程师集合为j的最大工程个数,那么有dp[i][j]=max(dp[i-1][j],dp[i-1][j^x]+1),用way[i]记录第i个工程可行的方案,然后转移就行了 trick 代码 #include <bits/...

anquan1533的博客 148

Engineer Assignment HDU - 6006(状压dp)

Problem Description In Google, there are many experts of different areas. For example, MapReduce experts, Bigtable experts, SQL experts, etc. Directors need to properly assign experts to various proje

退役的铜牌狗 382

HDU - 6006 - Engineer Assignment (状压dp)

链接: http://acm.hdu.edu.cn/showproblem.php?pid=6006 题意: 一个项目需要一个或多个技能,一个人拥有一个或多个技能,给出项目和人的详情,问最多能完成多少项目。 思路: 状压dp。 先预处理出能第i个任务可以由哪些人一起完成,所以可以用状态压缩,然后dp[i][j]来表示表前i个任务,状态为j时,最多完成的任务数 #include &l...

刘二狗的博客 367

HDU6006 Engineer Assignment 状压DP

简略题意:n个项目,m个工程师,每个工程师可以提供Di种技术支持,每个项目需要Ci种技术,每个工程师只能属于一个项目。问最多能完成几个项目。因为每个工程师只能被用一次,那么根据当前还剩哪些工程师空闲,我们就可以知道当前这个项目能不能被完成。 用dp[i][j]代表当前处理到第i个项目,还剩下的工程师集合是j。 转移有两种: 1. 不做当前的项目, dp[i+1][j] = dp[i][j]。

即使摸爬滚打,满身泥泞,我也要前进 296

Engineer Assignment HDU - 6006 状压dp

http://acm.split.hdu.edu.cn/showproblem.php?pid=6006 比赛的时候写了一个暴力,存暴力,过了,还46ms 那个暴力的思路是,预处理can[i][j]表示第i个人能否胜任第j个项目,能胜任的条件就是它和这个项目有共同的需求。 然后暴力枚举每一个人去搭配哪一个项目, #include <iostream> #include...

weixin_30706507的博客 101

HDU 6006 Engineer Assignment(状压dp)

Engineer Assignment Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1164    Accepted Submission(s): 397   Problem Description In Google, the...

LSD20164388的博客 286

HDU6006(2016CCPC-Final H Engineer Assignment 状压dp)

题意: n(n<=10)个工程 m(<=10)个工程师。每个工程需要一些技术(技术个数<=3) 一个工程师精通一些技术(技术个数<=2) 。一个工程师只能去一个工程干活,一个工程师可以担任一个工程里的多个技术。问最多多少个工程可以开工。技术种类数<=100。 思路: dp[i][S]: 前 i 个工程,S表示1-m个工程师选与不选的状态。 dp[i][S]=max(d...

qq_42576687的博客 284
上一篇: zoj 3777 Problem Arrangement(状压dp)
下一篇: hdu 4857 逃生(拓扑排序)
ciel_s
博客等级 码龄11年 18粉丝 51原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值