Doing Homework(hdu)1074
Doing Homework
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 6967 Accepted Submission(s): 3043
Each test case start with a positive integer N(1<=N<=15) which indicate the number of homework. Then N lines follow. Each line contains a string S(the subject's name, each string will at most has 100 characters) and two integers D(the deadline of the subject), C(how many days will it take Ignatius to finish this subject's homework).
Note: All the subject names are given in the alphabet increasing order. So you may process the problem much easier.
3
In the second test case, both Computer->English->Math and Computer->Math->English leads to reduce 3 points, but the
word "English" appears earlier than the word "Math", so we choose the first order. That is so-called alphabet order.
1 #include<stdio.h>
2 #include<algorithm>
3 #include<iostream>
4 #include<string.h>
5 #include<stdlib.h>
6 #include<queue>
7 #include<stack>
8 #define sc(x) scanf("%I64d",&x)
9 #define pr(x) printf("%I64d",x);
10 #define prr(x) printf("%I64d\n",x);
11 #define prrr(x) printf(" %I64d",x);
12 #define FOR(i,p,q) for(int i=p;i<=q;i++)
13 int cmp(char *p,char *q);
14 typedef struct pp
15 {
16 int x;
17 int y;
18 char a[200];
19 } ss;
20 ss ab[20];
21 char bc[20][200];
22 const int N=1e9;
23 typedef struct qq
24 {
25 int time;
26 int pre;
27 int no;
28 int cost;
29 } kk;//结构体存这个状态的时间当前加入作业的编号,所罚的时间,和前一个状态
30 kk dp[1<<15+1];
31 using namespace std;
32 int main(void)
33 {
34 int n,i,j,k,p,q;
35 scanf("%d",&k);
36 while(k--)
37 {
38 scanf("%d",&n);
39 for(i=0; i<n; i++)
40 {
41 scanf("%s",ab[i].a);
42 scanf("%d %d",&ab[i].x,&ab[i].y);
43 }
44 for(i=0; i<(1<<15)+1; i++)
45 {
46 dp[i].cost=N;
47 }//初始化
48 dp[0].cost=0;
49 dp[0].pre=-1;
50 dp[0].time=0;//开始的时间等状态
51 for(i=1; i<(1<<n); i++)
52 {
53 for(j=0; j<n; j++)
54 {
55 if(i&(1<<j))//当前这个状态含有第j个作业
56 {
57 if(ab[j].x<=dp[i^(1<<j)].time)//找不含j的前一个状态,并用前一个状态结束时间与第j个作业截至时间比较,然后分情况讨论下
58 {
59 int cc=dp[i^(1<<j)].time-ab[j].x;
60 if(dp[i].cost>dp[i^(1<<j)].cost+cc+ab[j].y)
61 {
62 dp[i].cost=dp[i^(1<<j)].cost+cc+ab[j].y;
63 dp[i].pre=i^(1<<j);
64 dp[i].no=j;
65 dp[i].time=dp[i^(1<<j)].time+ab[j].y;
66 }
67 else if(dp[i].cost==dp[i^(1<<j)].cost+cc+ab[j].y)
68 {
69 if(cmp(ab[j].a,ab[dp[i].no].a)>0)//按字典序排序,将最大的放最后,因为没个都是两两比较
70 {
71 dp[i].cost=dp[i^(1<<j)].cost+cc+ab[j].y;
72 dp[i].pre=i^(1<<j);
73 dp[i].no=j;
74 dp[i].time=dp[i^(1<<j)].time+ab[j].y;
75 }
76 }
77 }
78 else
79 {
80 int uu=ab[j].y+dp[i^(1<<j)].time;
81 int cc=uu-ab[j].x;
82 if(cc<=0)
83 {
84 if(dp[i].cost>dp[i^(1<<j)].cost)
85 {
86 dp[i].cost=dp[i^(1<<j)].cost;
87 dp[i].pre=i^(1<<j);
88 dp[i].no=j;
89 dp[i].time=dp[i^(1<<j)].time+ab[j].y;
90 }
91 else if(dp[i].cost==dp[i^(1<<j)].cost)
92 {
93 if(cmp(ab[j].a,ab[dp[i].no].a)>0)
94 {
95 dp[i].cost=dp[i^(1<<j)].cost;
96 dp[i].pre=i^(1<<j);
97 dp[i].no=j;
98 dp[i].time=dp[i^(1<<j)].time+ab[j].y;
99 }
100 }
101
102 }
103 else
104 {
105 if(dp[i].cost>dp[i^(1<<j)].cost+cc)
106 {
107 dp[i].cost=dp[i^(1<<j)].cost+cc;
108 dp[i].pre=i^(1<<j);
109 dp[i].no=j;
110 dp[i].time=dp[i^(1<<j)].time+ab[j].y;
111 }
112 else if(dp[i].cost==dp[i^(1<<j)].cost+cc)
113 {
114 if(cmp(ab[j].a,ab[dp[i].no].a)>0)
115 {
116 dp[i].cost=dp[i^(1<<j)].cost+cc;
117 dp[i].pre=i^(1<<j);
118 dp[i].no=j;
119 dp[i].time=dp[i^(1<<j)].time+ab[j].y;
120 }
121 }
122
123 }
124
125 }
126 }
127 }
128 }
129 printf("%d\n",dp[(1<<n)-1].cost);
130 int pf=dp[(1<<n)-1].pre;
131 int zk=0;
132 while(zk<n-1)
133 {
134
135 strcpy(bc[zk],ab[dp[pf].no].a);
136 zk++;
137 pf=dp[pf].pre;
138 }
139 for(i=n-2;i>=0;i--)
140 {
141 printf("%s\n",bc[i]);
142 }printf("%s\n",ab[dp[(1<<n)-1].no].a);
143 }
144
145
146 }
147 int cmp(char *p,char *q)
148 {
149 return strcmp(p,q);
150 }
状压DP
Doing Homework(hdu)1074的更多相关文章
- (hdu)5391 Zball in Tina Town
题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=5391 Problem Description Tina Town is a friendl ...
- (hdu)1285 确定比赛名次
Problem Description 有N个比赛队(<=N<=),编号依次为1,,,....,N进行比赛,比赛结束后,裁判委员会要将所有参赛队伍从前往后依次排名,但现在裁判委员会不能直接 ...
- Doing Homework(HDU 1074状压dp)
题意:给你n个要做的作业,它们的名字.期限.可完成所需天数(必须连续)在规定期限不能完成要扣分(每天一分)求做作业顺序使扣分最少. 分析:作业数量较少,用状态压缩,做到第i种作业花费的天数dp[i]. ...
- (hdu)1042 N! 大数相乘
题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=1042 Problem Description Given an integer N( ≤ ...
- (hdu)5234 Happy birthday 二维dp+01背包
题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=5234 Problem Description Today is Gorwin’s birt ...
- (hdu)4858 项目管理 (vector)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4858 Problem Description 我们建造了一个大项目!这个项目有n个节点,用很多边连接起 ...
- 杭电(hdu)ACM 4548 美素数
美素数 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) Total Submis ...
- 2019-2020 ICPC, Asia Jakarta Regional Contest A. Copying Homework (思维)
Danang and Darto are classmates. They are given homework to create a permutation of N integers from ...
- (hdu)1257 最少拦截系统
题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=1257 Problem Description 某国为了防御敌国的导弹袭击,发展出一种导弹拦 ...
随机推荐
- jquery chosen onchange 值改变时触发方法
jquery chosen onchange 值改变时触发方法如下:$(".chzn-select").chosen().on("change", functi ...
- kubernetes部署kube-scheduler服务
同样的分非认证授权和认证授权: 非认证授权: cat > /lib/systemd/system/kube-scheduler.service <<EOF [Unit] Descri ...
- linux系统中安装MySQL
linux系统中安装MySQL 检查原来linux系统中安装的版本 rpm -qa | grep mysql 将其卸载掉 以 mysql-libs-5.1.71-1.el6.x86_64 版本为例 r ...
- keeper及er表示被动
一些像employ这样的动词有employer和employee两个名词,而keep的名词只有keeper,keepee不是词.美剧FRIENDS和TBBT里出现了He/she is a keeper ...
- Web安全学习二
目录 常见漏洞攻防 SQL注入 注入分类 按技巧分类 按获取数据的方式分类 注入检测 权限提升 数据库检测 绕过技巧 CheatSheet SQL Server Payload MySQL Paylo ...
- MyBatis(4):使用limit实现分页
用limit实现分页,首先要创建一个Maven项目,搭建好mybatis的实验环境,并且连接好数据库 代码 1,编写dao接口 UserMapper //查询全部用户实现分页 List<User ...
- SpringMVC(2):JSON
一,JSON 介绍 JSON (JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式.易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效 ...
- JpaRepository 增删改查
Jpa查询 JpaRepository简单查询 基本查询也分为两种,一种是spring data默认已经实现,一种是根据查询的方法来自动解析成SQL. 预先生成方法 spring data jpa 默 ...
- matplotlib subplot 多图合一
1:第一种方法 # method1: subplot2grid ################# ''' 第一个参数(3, 3) 是把图分成3行3列 第二个参数是位置 (0, 0)表示从0行0列开始 ...
- 去除指定….RemoveMatching…(Power Query 之 M 语言)
表去除指定行: =Table.RemoveMatchingRows( 表, 列表, "指定列") 表中指定列中与列表中相同的行会被去除 表只有一列时,第三参数可以缺省 示例1:&q ...