UVA - 10817 Headmaster's Headache
题目大意:有一些老师,每一位都有自己的工资以及教授的课程。共s<=8个课程。其中的一些老师必须选择,问你保证每节课至少有一个老师的最少总工资。
题解:
首先很容易想到状态压缩,搞一个3进制的数,分别表示每一门课程的情况,一共38=6561。但是这样是不行的,相当于暴力啊!
一个套路:三进制转化为二进制*2。也就是搞一个216的数,1~8和9~16表示每门课程,这样就可以利用位运算了。
然后知道这个就很显然的,一个背包问题。要注意,这样转化为二进制之后,要定义一条规则,每次添加课程,优先1~8位,有了就再加到9~16位即可。
处理出所有强制选择的老师的授课状态S,令dp[S]=sum{c[]}。其他的全是INF。然后从All=(1<<(s*2)-1到S。当成01背包做即可。
1 #include<queue> 2 #include<cstdio> 3 #include<vector> 4 #include<cstring> 5 #include<iostream> 6 #include<algorithm> 7 #define RG register 8 #define LL long long 9 #define fre(a) freopen(a".in","r",stdin);//freopen(a".out","w",stdout); 10 using namespace std; 11 const int MAXN=1000; 12 int s,n,m,S,sum,All; 13 int c[MAXN],a[MAXN],dp[1<<16]; 14 char ch; 15 int main() 16 { 17 while(scanf("%d%d%d",&s,&n,&m)!=EOF) 18 { 19 if(s==0)break; 20 All=(1<<(s*2))-1; 21 for(int i=1,flag,x;i<=n+m;i++)//鬼里鬼气的输入 22 { 23 a[i]=0; 24 scanf("%d",&c[i]); 25 flag=0; 26 while(1) 27 { 28 ch=getchar(); 29 while(ch<'0'||ch>'9') 30 { 31 if(ch=='\n'||ch=='\r') { flag=1; break; } 32 ch=getchar(); 33 } 34 if(flag)break; 35 x=0; 36 while('0'<=ch&&ch<='9')x=x*10+(ch-'0'),ch=getchar(); 37 a[i]|=(1<<(x-1)); 38 if(ch=='\n'||ch=='\r')break; 39 } 40 } 41 S=sum=0; 42 for(int i=1;i<=n;i++)//按照规则,优先填后面的 43 { 44 sum+=c[i]; 45 int p=S&a[i]; 46 S|=(p<<s); 47 S|=a[i]; 48 } 49 memset(dp,0x3f3f3f3f,sizeof dp); 50 dp[S]=sum; 51 for(int i=n+1;i<=n+m;i++) 52 { 53 for(int j=All;j>=S;j--)//按照规则,优先填后面的 54 { 55 int p=a[i]&j; 56 p=a[i]|(p<<s); 57 dp[j|p]=min(dp[j|p],dp[j]+c[i]); 58 } 59 } 60 printf("%d\n",dp[All]); 61 } 62 return 0; 63 }
转载于:https://www.cnblogs.com/D-O-Time/p/7717803.html
UVA - 10817 Headmaster's Headache相关推荐
- 状压DP UVA 10817 Headmaster's Headache
题目传送门 1 /* 2 题意:学校有在任的老师和应聘的老师,选择一些应聘老师,使得每门科目至少两个老师教,问最少花费多少 3 状压DP:一看到数据那么小,肯定是状压了.这个状态不好想,dp[s1][ ...
- uva 10817——Headmaster's Headache
题意:某个学校有m个老师和n个求职者,需要讲授s个课程,已知每个人的工资c和能交的课程,求花费最小使得每门课程都至少有两个人教. 思路:状压dp,将每个老师要交的课程压缩成一个数,然后对于每门课,找到 ...
- Uva 10817 校长的烦恼
题目链接:https://uva.onlinejudge.org/external/108/10817.pdf 题意:m个教师,n个应聘者,s个课程,每个人的工资为c,每个人能教一些课程.求最少的支付 ...
- Headmaster's Headache
题意: s门课程,现任老师有m个给出工资,和他们能教的课,现在有n个应聘的老师,给出费用和能教的课程标号,求使每门课都至少有两个老师教的最小花费 分析: n个老师选或不选有背包的特征,n很小想到用状压 ...
- 紫书《算法竞赛入门经典》
紫书<算法竞赛入门经典>题目一览 第3章 数组和字符串(例题) UVA 272 TEX Quotes UVA 10082 WERTYU UVA 401 Palindromes UVA 34 ...
- 提取了下刘汝佳推荐的题号...
今天闲来没事上uva oj提取了下刘汝佳推荐的acm题号,原始数据如下: Volume 0. Getting Started 10055 - Hashmat the Brave Warrior ...
- UVa在线比赛单题汇总-----DP专题
动态规划基础 例题 LA 3882 UVa 3882 - And Then There Was One 递推------------无力orz UVa 10635 10635 - Prince and ...
- 《算法竞赛入门经典——训练指南》第一章相关内容
#<算法竞赛入门经典--训练指南>第一章相关内容 希望各位大牛能指导! 红色为已经做了的...黄色背景是还有不懂地方,希望在年前能刷完第一章啊.... 更新版.google上貌似又加了ex ...
- UVa Online Judge 工具網站
UVa Online Judge 工具網站 转自http://www.csie.ntnu.edu.tw/~u91029/uva.html Lucky貓的ACM園地,Lucky貓的 ACM 中譯題目 M ...
最新文章
- swing java管理系统_Java swing实现酒店管理系统
- [转] JavaScript:彻底理解同步、异步和事件循环(Event Loop)
- html动态报警图片,报警记录.html
- android uri获取参数,android-无法从深度链接获取Uri数据
- 2011年的总结:Fans同学的成败得失
- pycharm的演示模式、无干扰模式、全屏模式(presentation mode、distraction free mode、full screen mode)
- [lct] Luogu P4219 大融合
- thinkphp5.0连接mysql_thinkphp5.0数据库操作
- 注意细节:Javascript中的变量作用域
- three 实现绕物体旋转,卫星绕星球旋转
- 移动终端WAPI证书快速下载并自动连接解决方案
- 克隆巴赫系数 Cronbach‘s alpha 及 R, Python 实现
- sklearn神经网络/BP神经网络实现葡萄酒分类问题
- 计算机应用后期影音制作,影音制作工具(ImTOO Movie Maker)
- 怎html样在图片两边加上空白,怎样在博客两边空白处加上自己喜欢的图片?
- 关于DMA,TCM和Cache
- Java新手入门200例124之用JDBC连接Mysql数据库
- 用图灵机器人2.0实现聊天机器人
- ‘数据库基础、MariaDB服务部署、库表基本管理、数据类型’经典案例
- 文化中国 系列二:纪连海读历史品人物
热门文章
- arm-linux-gcc 命令未找到问题
- [唐胡璐]VBS技巧 - Find a File Recursively(递归查找文件)
- 2012 金华现场赛 A题
- 一个项目告一段落,终于可以回家过年了。
- socket中的几个数据结构
- AndroidStudio_后台服务以及活动和服务间通信_通过service中的binder实现活动和服务的通信---Android原生开发工作笔记216
- Python工作笔记002---PYTHON之DEF函数
- SpringCloud工作笔记067---消息推送_推送视频_推送图片_在通知栏里显示图片视频_自定义点击消息后的动作
- hibernate集合类型映射
- 堆内存里的各种奇怪填充值