Doing Homework again

Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)

Total Submission(s): 1221    Accepted Submission(s): 715

Problem Description

Ignatius has just come back school from the 30th ACM/ICPC. Now he has a lot of homework to do. Every teacher gives him a deadline of handing in the homework. If Ignatius hands in the homework after the deadline, the teacher will reduce his score
of the final test. And now we assume that doing everyone homework always takes one day. So Ignatius wants you to help him to arrange the order of doing homework to minimize the reduced score.

Input

The input contains several test cases. The first line of the input is a single integer T that is the number of test cases. T test cases follow.

Each test case start with a positive integer N(1<=N<=1000) which indicate the number of homework.. Then 2 lines follow. The first line contains N integers that indicate the deadlines of the subjects, and the next line contains N integers that indicate the reduced
scores.

Output

For each test case, you should output the smallest total reduced score, one line per test case.

Sample Input

3

3

3 3 3

10 5 1

3

1 3 1

6 2 3

7

1 4 6 4 2 4 3

3 2 1 7 6 5 4

Sample Output

0

3

5

解题心得:

1、这个题和普通的动态规划还是有差别的,它每一个元素都有一个截止日期,所以不能按照普通的动态规划来做。主要是想办法解决这个截止日期的问题。怎么在截止日期之内或得最多的分。

2、首先可以按照截止日期拍一个序,按照贪心的思想,肯定 是截止日期越前面的越先考虑。然后每一门课程从当前的截止日期开始往前面规划。在往前面规划的时候需要考虑一个问题,那就是当前是否已经安排满了。如果没有安排满,例如:第三天只安排了两天的作业,那么那门课程可以直接加在第三天上面就可以了,但是如果当天已经安排满了的情况下,就需要比较安排在当天的课程得分最少的那个和现在这门等待安排的课程比较哪个得分更多。如果当前得分大于已经安排了的的最少的得分,那么就将最少得分的那个减去,把现在这个安排进去。这个实现方法我想了一下,好像也只有使用优先队列,然后控制一下优先队列,这个题就很容易弄出来了。

#include<bits/stdc++.h>
using namespace std;
const int maxn = 1100;
struct sub
{
int dead;
int score;
friend bool operator <(sub a,sub b)
{
return a.score > b.score;
}
} su[maxn];
struct DP
{
int num;
int sum;
priority_queue <sub> qu;//dp数组里面的优先队列拿来记录这一天中安排的作业有哪些
}dp[maxn];
bool cmp(sub a,sub b)
{
return a.dead < b.dead;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int Max = 0;
int sum = 0;
int n,time = 0; //这个输入有点烦
scanf("%d",&n);
for(int i=1; i<=n; i++)
{
scanf("%d",&su[i].dead);
if(su[i].dead > time)
time =su[i].dead;
}
for(int i=0;i<=time;i++)
{
while(!dp[i].qu.empty())
dp[i].qu.pop();
dp[i].num = 0;
dp[i].sum = 0;
}
for(int i=1;i<=n;i++)
{
scanf("%d",&su[i].score);
sum += su[i].score;
} sort(su + 1,su + n + 1,cmp);//按照贪心的思想,从截止日期的先后进行排序
for(int i=1;i<=n;i++)
{
for(int j=su[i].dead;j>=1;j--)
{
if(dp[j].num < j && dp[j].sum < dp[j-1].sum + su[i].score)//当天没有安排满,就将这个作业直接安排在这一天
{
dp[j].sum = dp[j-1].sum + su[i].score;
dp[j].qu = dp[j-1].qu;
dp[j].qu.push(su[i]);
dp[j].num = dp[j-1].num + 1;
}
else if(dp[j].num == j && dp[j].sum < dp[j].sum - dp[j].qu.top().score + su[i].score)//当天安排满了,并且等待安排的这个作业比已经安排在这一天的作业中的最小的那个得分更高
{
dp[j].sum = dp[j].sum - dp[j].qu.top().score + su[i].score;
dp[j].qu.pop();
dp[j].qu.push(su[i]);
}
if(dp[j].sum > Max)//记录一下获得的最高的分
Max = dp[j].sum;
}
}
printf("%d\n",sum-Max);//总分减去最高的分就是被扣的最少的分
}
return 0;
}

动态规划:HDU1789-Doing Homework again的更多相关文章

  1. 解题报告 HDU1789 Doing Homework again

    Doing Homework again Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64 ...

  2. HDU1789 Doing Homework again 做作业【贪心】

    题目链接:https://vjudge.net/problem/HDU-1789 题目大意: 给出N个作业的截至日期,和N个作业不交所扣掉的分数,要求输出扣除分数做少的方案. 解析: 与上一道销售商品 ...

  3. hdu1789 Doing Homework again(贪心+排序)

    Doing Homework again Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Oth ...

  4. HDU1789 Doing Homework again 【贪心】

    Doing Homework again Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Oth ...

  5. HDU-1789 Doing Homework again 贪心问题 有时间限制的最小化惩罚问题

    题目链接:https://cn.vjudge.net/problem/HDU-1789 题意 小明有一大堆作业没写,且做一个作业就要花一天时间 给出所有作业的时间限制,和不写作业后要扣的分数 问如何安 ...

  6. HDU1789 Doing Homework again

    基础单调队列: #include<cstdio> #include<cstdlib> #include<iostream> #include<algorith ...

  7. hdu1789 Doing Homework again---(经典贪心)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1789 题目大意: 给出N个作业的截至日期,和N个作业不交所扣掉的分数,要求输出扣除分数做少的方案. ...

  8. HDU1789(Doing Homework again)题解

    HDU1789(Doing Homework again)题解 以防万一,题目原文和链接均附在文末.那么先是题目分析: [一句话题意] 给定任务分数和其截止日期,每日可完成一任务,输出当罚分尽可能小时 ...

  9. HDU 1074 Doing Homework (动态规划,位运算)

    HDU 1074 Doing Homework (动态规划,位运算) Description Ignatius has just come back school from the 30th ACM/ ...

随机推荐

  1. C#与重构(入门)

    C#与代码重构(入门) 重构(Refactoring)就是通过调整程序代码改善软件的质量.性能,使其程序的设计模式和架构更趋合理,提高软件的扩展性和维护性. 单从概念少来理解重构可能很抽象,那么通过下 ...

  2. 关于myeclipse导入项目时出现的中文注释乱码问题

         要设置myeclipse的编码,需要了解各个设置项的作用      第一类编码设置项,虽然有三处设置,但是是可以归为一类的 第一处为myeclipse的工作区(workspace),其范围最 ...

  3. css盒子模型 css3盒子相关样式

    1.内边距(内边距在content外,边框内) 内边距属性: padding          设置所有边距 padding-bottom     底边距 padding-left           ...

  4. java8Stream map和flatmap的区别

    map和flatmap的区别 map只是一维 1对1 的映射 而flatmap可以将一个2维的集合映射成一个一维,相当于他映射的深度比map深了一层 , 所以名称上就把map加了个flat 叫flat ...

  5. vue-extend 选项

    vue-extend 选项 mixins 和extend 很相似,但有区别: var extendNews={ //后来的内容用变量接收 updated:function(){ console.log ...

  6. 2013 QConf上海软件开发大会总结

    带着工作中的一些疑问,我参加了在上海举办的QConf 全球软件开发大会.会议以主题的形式按分会场召开,我主要选择知名网站案例分析.大数据处理技术.高效能团队建设和金融系统架构与设计四个主题内容.三天会 ...

  7. PHP与MYSQL结合操作——文章发布系统小项目(实现基本增删查改操作)

    php和mysql在一起几十年了,也是一对老夫老妻了,最近正在对他们的爱情故事进行探讨,并做了一个很简单的小东西——文章发布系统,目的是为了实现mysql对文章的基本增删查改操作 前台展示系统有:文章 ...

  8. 微信jssdk实现分享到微信

    本来用的是这个插件http://overtrue.me/share.js/和百度分享 相同之处:在微信分享的时候,分享的链接都不能获取到缩略图... 不同之处:百度分享在微信低版本是可以看到缩略图的( ...

  9. Android(java)学习笔记96:layout_weight使用注意事项

    1. android:layout_weight使用说明: layout_weight是权重的意思,也就是各个控件所占的比重,用在LinearLayout布局中.当我们使用layout_weight的 ...

  10. bzoj4622 [NOI 2003] 智破连环阵

    Description B国在耗资百亿元之后终于研究出了新式武器——连环阵(Zenith Protected Linked Hybrid Zone).传说中,连环阵是一种永不停滞的自发性智能武器.但经 ...