UVa 10817 校长的烦恼
2024-08-27 01:52:48
https://vjudge.net/problem/UVA-10817
题意:
某校有m个教师和n个求职者,需讲授s个课程,已知每人的工资c和能教的课程集合,要求支付最少的工资使得每门课都至少有两名老师能教。
思路:
s1表示恰好有一个人教的科目集合,s2表示至少有两个人教的科目集合。
d[i][s1][s2]表示已经考虑了前i个人时的最小花费。参考了大神的代码,如下:
#include<iostream>
#include<string>
#include<cstring>
#include<sstream>
#include<algorithm>
using namespace std; const int maxn = + ;
const int maxs = + ;
#define INF 100000000
int m, n, s;
int c[maxn], st[maxn];//数组c表示工资,st表示第i个老师教课的集合
int d[maxn][ << maxs][ << maxs]; int dp(int i, int s0, int s1, int s2)
{
if (i == m + n)
return s2 == ( << s) - ? : INF;//如果s2恰好等于全部课程的集合时,已经满足题意,不需要花钱
int& ans = d[i][s1][s2];
if (ans >= )return ans;
ans = INF;
if (i >= m) ans = dp(i + , s0, s1, s2);//不选第i个应聘者,由于选i应聘者会导致s0,s1,s2改变,因此先初始化成不选
int m0 = st[i] & s0;//只有第i个应聘者会教的课程
int m1 = st[i] & s1;//第i个应聘者也会教的课程
s0 ^= m0;//在s0集合中除去所有只有i应聘者会教的课程,即m0
s1 = (s1^m1) | m0;//m1代表的所有课程变为了至少两个人会教,从s1中除去,同时加上m0
s2 |= m1;//将m1添加到s2
ans = min(ans, c[i] + dp(i + , s0, s1, s2));//选第i个应聘者,取较小者
return ans;
} int main()
{
//freopen("D:\\txt.txt", "r", stdin);
while (~scanf("%d%d%d", &s, &m, &n) && s&&m&&n)
{
memset(d, -, sizeof(d));
memset(st, , sizeof(st));
getchar();
for (int i = ; i < m + n; i++)
{
string str;
getline(cin, str);
stringstream ss(str);
int x, flag = ;
while (ss >> x)
{
if (flag){ flag = ; c[i] = x; }
else
{
x--; //将科目从0开始编号
st[i] |= ( << x); //二进制的压缩存储
}
}
}
int ans = dp(, ( << s) - , , );
printf("%d\n", ans);
}
return ;
}
最新文章
- [Java][Weblogic] weblogic.net.http.SOAPHttpsURLConnection incompatible with javax.net.ssl.HttpsURLConnection解决办法
- 等号赋值与memcpy的效率问题
- java识别简单的验证码
- oracle学习 十一 包+复合类型+自定义异常(持续更新)
- vs2013编译boost库
- Node.js 【使用npm安装一些包失败之笔记】
- Android动态加载技术初探
- ubuntu14.04 为Firefox安装flash插件
- MyEclipse汉化后问题
- Machine Learning—Linear Regression
- 第三方框架ViewPagerIndicator引入到Android Studio的方法总结
- SpringCloud学习之Hystrix
- 迄今为止 .Net 平台功能最强大,性能最佳的 JSON 序列化和反序列化库。
- composer阿里云短信服务不支持传参为数值--为2017年短信接口,2018阿里云有更新http://www.cnblogs.com/q1104460935/p/8916096.html
- 【转】无法获得锁 /var/lib/dpkg/lock - open (11: 资源暂时不可用) ubuntu 安装vim 及遇到的错误处理
- Selenium自动化测试Python三:WebDriver进阶
- Spark记录-Scala语句(运算符-if-for-while-try-模式匹配)
- jQuery之前端国际化jQuery.i18n.properties[转]
- 一、JSON解析与字符串化
- Kotlin中常量和静态方法
热门文章
- django 中的render和render_to_response()和locals()
- INT_MAX和INT_MIN注意事项
- [LeetCode] 256. Paint House_Easy tag: Dynamic Programming
- 机器学习理论基础学习16---高斯网络(GN)
- 关于 WebBrowser调用百度地图API 鼠标滚轮缩放地图级别失灵的解决办法
- Python 在序列上跟踪索引和值
- 数据仓库原理<;4>;:联机分析处理(OLAP)
- RHEL6.4 字符模式下安装图形界面图文教程
- C/C++之面向对象
- 又一国产855旗舰突然现身:支持5G