题目链接:

http://acm.hdu.edu.cn/showproblem.php?pid=5501

The Highest Mark

 Accepts: 32
 Submissions: 193
 Time Limit: 2000/1000 MS (Java/Others)
 Memory Limit: 131072/131072 K (Java/Others)
问题描述
2045年的SD省队选拔,赛制和三十年前已是完全不同。一场比赛的比赛时间有 tt 分钟,有 nn 道题目。
第 ii 道题目的初始分值为 A_i(A_i \leq 10^{6})A​i​​(A​i​​≤10​6​​) 分,之后每过一分钟这道题目的分值会减少 B_iB​i​​ 分,并且保证到比赛结束时分值不会减少为负值。比如,一个人在第 xx 分钟结束时做出了第 ii 道题目,那么他/她可以得到 A_i - B_i * xA​i​​−B​i​​∗x 分。
若一名选手在第 xx 分钟结束时做完了一道题目,则他/她可以在第 x+1x+1 分钟开始时立即开始做另一道题目。
参加省队选拔的选手 dxy 具有绝佳的实力,他可以准确预测自己做每道题目所要花费的时间,做第 ii 道需要花费 C_i(C_i \leq t)C​i​​(C​i​​≤t) 分钟。由于 dxy 非常神,他会做所有的题目。但是由于比赛时间有限,他可能无法做完所有的题目。他希望安排一个做题的顺序,在比赛结束之前得到尽量多的分数。
输入描述
第一行为一个正整数 T(T \leq 10)T(T≤10),表示数据组数(n>200n>200的数据不超过55组)。
对于每组数据,第一行为两个正整数 n (n \leq 1000)n(n≤1000) 和 t (t \leq 3000)t(t≤3000), 分别表示题目数量和比赛时间。接下来有 nn 行,每行 33 个正整数依次表示 A_i, B_i, C_iA​i​​,B​i​​,C​i​​,即此题的初始分值、每分钟减少的分值、dxy做这道题需要花费的时间。
输出描述
对于每组数据输出一行一个整数,代表dxy这场比赛最多能得多少分
输入样例
1
4 10
110 5 9
30 2 1
80 4 8
50 3 2
输出样例
88
Hint
dxy先做第二题,再做第一题,第一题得分为110-5*(1+9)=60110−5∗(1+9)=60,第二题得分为30-2*1=2830−2∗1=28,总得分为8888,其他任何方案的得分都小于8888

题解:

  贪心+01背包。

贪心:

  假设比赛时间无限大,每一道题目都能做完,那么你按照bi/ci由大到小排序的顺序完成所有题目会得到优成绩,

  为什么呢?

    任意两个相邻的题目i和j(i<j),先做i,你会损失分数:ci*bj;先做j,你会损失cj*bi,如果我们要先完成i,则有ci*bj<=cj*bi,即bi/ci>=bj/cj。

  现在考虑有限时间内,如果最优解中的几个问题不是按照这个顺序来完成的,那么我们经过以上操作调整之后能使损失减小,从而得到更优解。

  所以这个贪心是正确的。

dp:

  贪心完之后,跑一遍01背包就可以了。

代码:

 #include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std; const int maxn = ;
const int maxt = ; struct Node {
int a, b, c;
bool operator < (const Node& tmp) {
return b*tmp.c>c*tmp.b;
}
}node[maxn]; int N, T;
int dp[maxn][maxt]; int main() {
int tc;
scanf("%d", &tc);
while (tc--) {
scanf("%d%d", &N, &T);
for (int i = ; i <= N; i++) {
scanf("%d%d%d", &node[i].a, &node[i].b, &node[i].c);
}
sort(node + , node + N + );
/*
for(int i = 1; i <= N; i++) printf("%d ", node[i].a);
printf("\n");
*/
memset(dp[], , sizeof(dp[]));
for (int i = ; i <= N; i++) {
for (int j = ; j < node[i].c; j++) dp[i][j] = dp[i - ][j];
for (int j = node[i].c; j <= T; j++) {
dp[i][j] = max(dp[i - ][j], dp[i - ][j - node[i].c]+node[i].a-node[i].b*j);
}
}
int ans = ;
for (int i = ; i <= T; i++) ans = max(ans, dp[N][i]);
printf("%d\n", ans);
}
return ;
}

优化:

 #include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std; const int maxn = ;
const int maxt = ; struct Node {
int a, b, c;
bool operator < (const Node& tmp) {
return b*tmp.c>c*tmp.b;
}
}node[maxn]; int N, T;
int dp[maxt]; int main() {
int tc;
scanf("%d", &tc);
while (tc--) {
scanf("%d%d", &N, &T);
for (int i = ; i <= N; i++) {
scanf("%d%d%d", &node[i].a, &node[i].b, &node[i].c);
}
sort(node + , node + N + );
memset(dp, , sizeof(dp));
for (int i = ; i <= N; i++) {
for (int j = T; j >= node[i].c; j--) {
dp[j] = max(dp[j], dp[j - node[i].c] + node[i].a - node[i].b*j);
}
}
int ans = ;
for (int i = ; i <= T; i++) ans = max(ans, dp[i]);
printf("%d\n", ans);
}
return ;
}

HDU 5501 The Highest Mark的更多相关文章

  1. HDU 5501 The Highest Mark 背包dp

    The Highest Mark Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?p ...

  2. HDU 5501——The Highest Mark——————【贪心+dp】

    The Highest Mark Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Other ...

  3. hdu 5501 The Highest Mark(贪心+01背包)

    题意:类似cf的赛制,每道题目有A,B,C三个值,A表示初始分数,B表示每分钟题的分数会减少B,C表示做这道题需要C分钟,数据保证分数不会变为负数.现在给出比赛时长,问安排做题的顺序,求最大得分. 思 ...

  4. HDU 5501 The Highest Mark (贪心+DP,经典)

    题意: 有n道题目,每道题目的初始分数为Ai,分数每分钟减少Bi,完成此题需要Ci分钟,问在t分钟内最多能获得多少分? 思路: 好题~ 如果没有B的话,就是一道裸的01背包的题目了.每道题目的得分为: ...

  5. HDU 5501:The Highest Mark 01背包

    The Highest Mark  Accepts: 71  Submissions: 197  Time Limit: 2000/1000 MS (Java/Others)  Memory Limi ...

  6. The Highest Mark(01背包)

    The Highest Mark Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Other ...

  7. HDU5501/BestCoder Round #59 (div.2)The Highest Mark dp+贪心

    The Highest Mark 问题描述 2045年的SD省队选拔,赛制和三十年前已是完全不同.一场比赛的比赛时间有 tt 分钟,有 nn 道题目. 第 ii 道题目的初始分值为 A_i(A_i \ ...

  8. hdu5501 The Highest Mark

    Problem Description The SDOI in 2045 is far from what it was been 30 years ago. Each competition has ...

  9. HDU 5501 背包问题

    需要按照B/C的值从大到小排序. #include<cstdio> #include<cstring> #include<iostream> #include< ...

随机推荐

  1. HTML5 -- 浏览器数据缓存 -- indexedDB

    IndexedDB是一种可以让你在用户的浏览器内持久化存储数据的方法,为web应用提供了丰富的查询功能,使我们的应用在在线和离线都能正常工作. 由于 IndexedDB 本身的规范还在持续演进中,当前 ...

  2. 利用.htaccess文件将多个子域名解析至对应的子目录

    对于不支持子域名解析但是支持 .htaccess 的主机来说,这个功能就非常有用了 假设有主域名 ppios.com,子域名 yspx.ppios.com 和 ask.ppios.com,设置结果为访 ...

  3. Java ThreadLocal 源代码分析

    Java ThreadLocal 之前在写SSM项目的时候使用过一个叫PageHelper的插件 可以自动完成分页而不用手动写SQL limit 用起来大概是这样的 最开始的时候觉得很困惑,因为直接使 ...

  4. R语言-正则表达式1

    R语言的正则表达式主要用来处理文本资料,比如进行查找.替换等等. 首先是一些处理文本时会用到的函数: 字符串分割:strsplit() 字符串连接:paste(),paste0() 计算字符串长度:n ...

  5. Easyui 控件的初始化方法

    问题: Easyui的控件在初始化的时候有两种方式: 页面指定class属性 js里初始化该id为easyui的控件 那么问题是: 如果页面不指定class属性,只是使用js初始化的话,会导致无法用控 ...

  6. django项目的配置文件settings.py详解

    我们创建好了一个Python项目(mysite/)之后,需要在项目中添加模块应用(polls/),在模块应用中添加处理功能逻辑,如添加模块中的视图处理函数(polls.views.index()),这 ...

  7. Elasticsearch5.x版本中对Text类型进行聚合时提示illegal_argument_exception

    Having this field in my mapping "answer": { "type": "text", "fiel ...

  8. Spring学习(九)-----Spring bean配置继承

    在 Spring,继承是用为支持bean设置一个 bean 来分享共同的值,属性或配置. 一个子 bean 或继承的bean可以继承其父 bean 的配置,属性和一些属性.另外,子 Bean 允许覆盖 ...

  9. Mac下重置MySQL密码

    第一步要先停止掉mysql服务: brew services stop mysql 第二步查看mysql安装路径: brew info mysql //我这里是brew管理的所以我用brew查看mys ...

  10. TensorFlow深度学习实战---循环神经网络

    循环神经网络(recurrent neural network,RNN)-------------------------重要结构(长短时记忆网络( long short-term memory,LS ...