HDU1789 Doing Homework again

来源:互联网 发布:手机淘宝推广软件 编辑:程序博客网 时间:2024/05/17 01:34

题目来源:http://acm.hdu.edu.cn/showproblem.php?pid=1789

这道题的大概意思就是Ignatius要完成N项作业,并且给出了N项作业的提交时间,以及超过提交时间后所要扣的分数。并且题目给出了每一项作业需要一天完成。

这道题的思路比较简单,用贪心算法来解。给N项作业按分数从大到小排序,如果分数相等的情况下,则是把日期小的放在前面。这样我们优先完成分数大的,就符合了每次的最优选择。因此,我们需要设置一个用来记录每个任务的完成时间的数组 do_work[MAXN]。每次首先判断该任务的提交时间x是否在标记数组中存在,若不存在则直接do_work[x]=1。 若存在,则从x-1天开始,每次向前推进1天,知道找到没用来做作业的那天为止。(这里记得一定要从x-1天开始,向前推进,而不能从1开始,向x-1前进。后者不符合最优选择。在这里WA了好几次。)

这道题关于作业提交时间的范围没有给出来。但是MAXN=1005是可以AC的。

下面是仅供参考的代码:

#include <iostream>#include <algorithm>#include <cstring>using namespace std;#define MAXN 1005struct subjects{    int day,score;}work[MAXN];int do_work[MAXN];bool cmp(subjects const &A,subjects const &B){    return (A.score>B.score)||(A.score==B.score&&A.day<B.day);}int main(){    int t,n;    cin>>t;    while(t--)    {        cin>>n;        memset(do_work,0,sizeof(do_work));        for(int i=0;i<n;i++) cin>>work[i].day;        for(int i=0;i<n;i++) cin>>work[i].score;        sort(work,work+n,cmp);        int i,j,ans=0;        for(i=0;i<n;i++)        {            if(!do_work[work[i].day])                do_work[work[i].day]=1;            else            {                //这里一定要是从后往前,才符合最优选择。                for(j=work[i].day;j>=1;j--)                {                    if(!do_work[j]) break;                }                if(j>0) do_work[j]=1;                else ans+=work[i].score;            }        }        cout<<ans<<endl;    }    return 0;}



0 0