Doing Homework 状态压缩DP
2015-04-09 22:25
176 查看
Doing Homework
题目抽象:给出n个task的name,deadline,need。 每个任务的罚时penalty=finish-deadline; task不可以同时做。问按怎样的顺序做使得penalty最小。同时输出顺序。如果有多个满足条件的顺序,按字典序输出。
题目抽象:给出n个task的name,deadline,need。 每个任务的罚时penalty=finish-deadline; task不可以同时做。问按怎样的顺序做使得penalty最小。同时输出顺序。如果有多个满足条件的顺序,按字典序输出。
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <string> #include <vector> #include <stack> #include <queue> #include <set> #include <map> #include <list> #include <iomanip> #include <cstdlib> #include <sstream> using namespace std; typedef long long LL; const int INF=0x5fffffff; const double EXP=1e-6; const int MS=16; struct task { char name[105]; int deadline,need; }tasks[MS]; struct node { int time,penalty; // 到达这个状态的时间,和罚时 int cur,pre; // 状态s的物理变化过程 }nodes[1<<MS]; int n,m; void solve() { for(int i=1;i<=m;i++) // note i==1 nodes[i].penalty=INF; nodes[0].time=0; for(int i=0;i<=m;i++) { for(int j=0;j<n;j++) if(!((i>>j)&1)) { int next=i|(1<<j); int finish=nodes[i].time+tasks[j].need; int penalty=max(0,finish-tasks[j].deadline); penalty+=nodes[i].penalty; if(penalty<nodes[next].penalty) { nodes[next].time=finish; nodes[next].penalty=penalty; nodes[next].cur=j; nodes[next].pre=i; } } } } void output(int x) { if(x==0) return ; output(nodes[x].pre); printf("%s\n",tasks[nodes[x].cur].name); } int main() { int T; scanf("%d",&T); while(T--) { scanf("%d",&n); for(int i=0;i<n;i++) scanf("%s%d%d",tasks[i].name,&tasks[i].deadline,&tasks[i].need); m=(1<<n)-1; solve(); printf("%d\n",nodes[m].penalty); output(m); } return 0; }
相关文章推荐
- HDU-1074 Doing Homework 状态压缩DP
- HDU 1074 Doing Homework(状态压缩 + DP)
- hdu 1074 doing homework(状态压缩dp)
- 【状态压缩dp】HDU - 1074 Doing Homework
- HDU1074——Doing Homework(状态压缩dp)
- hdu1074 Doing Homework(状态压缩DP Y=Y)
- hdu 1074 Doing Homework(状态压缩dp)
- HDU1074:Doing Homework-状态压缩DP
- HDU 1074 Doing Homework DP 状态压缩
- HDU1074:Doing Homework(状态压缩DP)
- HDU 1074 Doing Homework(状态压缩dp)
- HDU1074——Doing Homework(状态压缩DP)
- HDU 1074 Doing Homework,dfs+剪枝(280ms),状态压缩+dp(15ms)
- hdu1074 Doing Homework(状态压缩dp)
- HDU 1074 Doing Homework (状态压缩DP)
- 【HDU1074 dp状态压缩】Doing Homework 第一道状态压缩dp
- Doing Homework HDU - 1074 (状态压缩DP) HQG_AC的博客
- !HDU 1074 Doing Homework--DP--(状态压缩)
- hdoj 1074 Doing Homework 【状态压缩dp】
- HDU 1074 Doing Homework(状态压缩DP)