ACM--Doing Homework again(贪心算法)

题目大意:一个同学完成老师布置的作业。每个作业都有一个期限和对应的扣分。在截止日没有完成,则会扣相应的分。问:如何安排做作业的顺序,才能使扣的总分最少(完成一个作业需要1天)

思路:根据贪心的思想,优先考虑扣分多的作业,先处理它们。
           具体做法,将作业以扣分多少降序排序。从扣分最多的作业开始,将它安排在它的截止日期那一天完成,若那天已经被占用了,则往前移一天,如果前面的天数都被占用了,则这个作业只能放弃,必须要被扣分.

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
using namespace std;
struct node
{
    int deadline;
	int score;
    
}a[1002];

int IsDone[2000];

bool cmp(node a,node b)
{
	return a.score>b.score;
}


int main()
{
    int Case,n;
    cin>>Case;
    while(Case--)
    {
        memset(IsDone,0,sizeof(IsDone));
        cin>>n;
        for(int i=1;i<=n;i++)
            cin>>a[i].deadline;
        for(int i=1;i<=n;i++)
            cin>>a[i].score;
        sort(a+1,a+n+1,cmp);
        int sum=0;
        for(int i=1;i<=n;i++)
        {
            int flag=0;
            for(int j=a[i].deadline;j>=1;j--)
            {
                if(!IsDone[j])
                {
                    IsDone[j]=1;
                    flag=1;
                    break;
                }
            }
            if(!flag)
            sum+=a[i].score;
        }
        cout<<sum<<endl;
    }
    return 0;
}
    原文作者:贪心算法
    原文地址: https://blog.csdn.net/qq328691560/article/details/46925959
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞