HDU1074 Doing Home Work - 状压dp
题目大意:
有n(\(\le 15\))个作业,每个作业有个name, deadline(截止日期),cost(做作业花的时间),如果没有按时完成某个作业,惩罚分数为超出的时间,求一个合理的顺序使得惩罚分数最小,如果有多个方案分数相同,输出字典序最小的。
题目分析
看到\(n \le 15\)可知状压dp:dp[S]表示完成S状态的最小惩罚分数,转移也较为简单:$$dp[i | (1 << (j - 1))] = min(dp[S | (1 << (j - 1))], dp[i] + getTime(i) + cost[j] - deadline[j])$$。因为要输出方案,于是记录一个from数组表示这个状态是从哪个状态转移来的。又因为要求字典序最小,现将name排序,这样在转移时如果\(dp[i | (1 << (j - 1))] == dp[i] + getTime(i) + cost[j] - deadline[j])\),并且\(i | (1 << (j - 1)) < from[i]\),那么\(from[i] = i | (1 << (j - 1))\),来保证字典序最小。
code
#include<bits/stdc++.h>
using namespace std;
const int N = 20, S = 33000, OO = 0x3f3f3f3f;
int n, dp[S], T, from[S];
vector<int> ans;
struct node{
string name;
int dl, cost;
inline bool operator < (const node &b) const {
return name < b.name;
}
}task[N];
inline int getTime(int s){
int ans = 0;
for (int i=0; (1<<i)<=s; i++)
if ((1<<i)&s)
ans += task[i + 1].cost;
return ans;
}
inline void init(){
memset(dp, OO, sizeof dp), dp[0] = 0;
memset(from, 0, sizeof from);
ans.clear();
}
inline int find(int x){
int l = 1, r = 15;
while (l<=r) {
int mid = (l + r) >> 1;
if (1<<(mid-1) == x) return mid;
else if (1<<(mid-1) > x) r = mid - 1;
else l = mid + 1;
}
return 0;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(NULL), cout.tie(NULL);
cin >> T;
while(T--){
init();
cin >> n;
for (int i=1; i<=n; i++) cin >> task[i].name >> task[i].dl >> task[i].cost;
sort(task + 1, task + n + 1);
for (int i=0; i<(1<<n); i++) {
for(int j=1; j<=n; j++) {
if (i&(1<<(j-1))) continue;
if (dp[i|(1<<(j-1))] > dp[i] + max(0, getTime(i) + task[j].cost - task[j].dl)) {
from[i|(1<<(j-1))] = i;
dp[i|(1<<(j-1))] = dp[i] + max(0, getTime(i) + task[j].cost - task[j].dl);
}
else if(dp[i|(1<<(j-1))] == dp[i] + max(0, getTime(i) + task[j].cost - task[j].dl)) {
if(i < from[i|(1<<(j-1))]) from[i|(1<<(j-1))] = i;
}
}
}
cout << dp[(1<<n)-1] << endl;
int now = (1<<n)-1;
while(now) {
int diff = now ^ (from[now]);
int pos = find(diff);
// cout << now << " " << from[now] << " " << diff << " " << pos << endl;
ans.push_back(pos);
now = from[now];
}
for(int i=ans.size()-1; i>=0; i--) cout << task[ans[i]].name << endl;
}
return 0;
}
HDU1074 Doing Home Work - 状压dp的更多相关文章
- kuangbin专题十二 HDU1074 Doing Homework (状压dp)
Doing Homework Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)To ...
- HDU1074 Doing Homework(状压dp)
链接:http://acm.hdu.edu.cn/showproblem.php?pid=1074 题意:给定有n门课的作业,每门课交作业有截止时间,和完成作业所花费的时间,如果超过规定时间完成,每超 ...
- HDU1074:Doing Homework(状压DP)
Doing Homework Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)To ...
- dp,状压dp等 一些总结
也就作业几题而已,分析一下提醒 最重要的就是,记住,没用的状态无论怎么转移最后都会是没用的状态,所以每次转移以后的有值的状态都是有用的状态. 几种思考方向: 第一种:枚举当前的状态,转移成另外一个状态 ...
- 对状压dp的见解
看了好几篇博客,终于对一些简单的状压dp有了点了解.就像HDU1074. 有个博客:https://blog.csdn.net/bentutut/article/details/70147989 感觉 ...
- 算法复习——状压dp
状压dp的核心在于,当我们不能通过表现单一的对象的状态来达到dp的最优子结构和无后效性原则时,我们可能保存多个元素的有关信息··这时候利用2进制的01来表示每个元素相关状态并将其压缩成2进制数就可以达 ...
- BZOJ 1087: [SCOI2005]互不侵犯King [状压DP]
1087: [SCOI2005]互不侵犯King Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 3336 Solved: 1936[Submit][ ...
- nefu1109 游戏争霸赛(状压dp)
题目链接:http://acm.nefu.edu.cn/JudgeOnline/problemShow.php?problem_id=1109 //我们校赛的一个题,状压dp,还在的人用1表示,被淘汰 ...
- poj3311 TSP经典状压dp(Traveling Saleman Problem)
题目链接:http://poj.org/problem?id=3311 题意:一个人到一些地方送披萨,要求找到一条路径能够遍历每一个城市后返回出发点,并且路径距离最短.最后输出最短距离即可.注意:每一 ...
随机推荐
- 关于React中,map出来的元素添加事件问题
用es6 map 的写法 直接绑定一个onTouchStart 事件不会报错. 用es5的map写法 如果不加上this 会报这个错误 无法读取未定义的属性 解决的方法是 绑定this 就可以了
- pt支持的格式
- 【Educational Codeforces Round 33 B】Beautiful Divisors
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 把所有的那些数字打表出来. 逆序枚举就好 [代码] /* 1.Shoud it use long long ? 2.Have you ...
- 洛谷——P1548 棋盘问题
https://www.luogu.org/problem/show?pid=1548#sub 题目描述 设有一个N*M方格的棋盘(l<=N<=100,1<=M<=100)(3 ...
- android问题及其解决-优化listView卡顿和怎样禁用ListView的fling
问题解决-优化listView卡顿和怎样禁用ListView的fling 前戏非常长,转载请保留出处:http://blog.csdn.net/u012123160/article/details/4 ...
- synchronized和ReentrantLock区别
一.什么是sychronized sychronized是java中最基本同步互斥的手段,可以修饰代码块,方法,类. 在修饰代码块的时候需要一个reference对象作为锁的对象. 在修饰方法的时候默 ...
- amazeui学习笔记--js插件(UI增强3)--折叠面板Collapse
amazeui学习笔记--js插件(UI增强3)--折叠面板Collapse 一.总结 注意点: 1.data-am-collapse:这个东西就是展开折叠事件 2.am-collapse(包括其下属 ...
- cURL(wget)—— 测试 RESTful 接口及模拟 GET/POST/PUT/DELETE/OPTIONS 请求
cURL 是一个简单的 http 命令行工具.与最优秀的 Unix 工具一样,在设计之时,cURL 是个小型程序,功能十分专一,而且是故意为之,仅用于访问 http 服务器.(在 Linux 中,可以 ...
- MongoDbHelper 帮助类(上)
在网上搜索mongodbHelper的帮助类时,出来的东西都大同小异,再此摘录一下. 这些代码也看了一遍,总是感觉重复的代码太多了,在后续的文章中又整合了一下,请看下篇,欢迎指正! using Sys ...
- apache与IIS共用80端口冲突解决方法
如果同一台电脑安装了apache和iis,会提示80端口冲突,如何解决apache与iis 80端口冲突的问题呢,并且同时使用apache和iis 将apache设为使用80端口,IIS使用其它端口, ...