HDU 1789 Doing Homework again 贪心

题意:有n门课程,每个课程有一个作业,每一个作业一天写完,一天只能写一门课作业,告诉你每一门课的最后交作业的期限,如果交不上就要扣除相应的学分,问你最少会扣除多少分?


想法:这题不是利用率贪心,就是简单的一点想法,首先按照完成的期限升序排序,因为你要先保证要完成期限少的,再去完成期限多的,因为期限少的不能在(少期限,大期限]这段区间完成而期限大的可以。当有超期限的那么他的学分一定会被扣掉,但是我们可以选择之前完成的作业里面扣分最少的和他换一下,那么不就保证扣分最少了吗?


#include<stdio.h>
#include<algorithm>
#include<queue>
using namespace std;
int n;
struct node
{
    int dl,sec;
    friend bool operator <(const node &a,const node &b)
    {
        return a.sec>b.sec;
    }
}hw[1000+5];
priority_queue<node>q;
bool cmp(node a,node b)
{
    if(a.dl==b.dl) return a.sec>b.sec;
    else return a.dl<b.dl;
}
int main()
{
    int test;
    scanf("%d",&test);
    while(test--)
    {
        scanf("%d",&n);
        while(!q.empty()) q.pop();
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&hw[i].dl);
        }
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&hw[i].sec);
        }
        sort(hw+1,hw+1+n,cmp);
        int sum=0,day=1;
        for(int i=1;i<=n;i++)
        {
            if(hw[i].dl<day)
            {
                q.push(hw[i]);
                node k=q.top();
                q.pop();
                sum+=k.sec;
            }
            else
            {
                q.push(hw[i]);
                day++;
            }
        }
        printf("%d\n",sum);
    }
    return 0;
}

你可能感兴趣的:(HDU 1789 Doing Homework again 贪心)