hdu 1789 Doing Homework again 贪心

来源:互联网 发布:影楼修片软件mac版 编辑:程序博客网 时间:2024/06/07 06:10

传送门:hdu 1789 Doing Homework again

题目大意

一个人从WF回来要写作业,但是每次只能做一个,每个作业都有对应的截止时间,如果过了截止时间就会扣相应的分数,求扣的最小分数
输入:第一行输入多组则是用例t
下面的一行输入有几门作业n,
再下面一行对应的这n门作业的截止时间,
再下面一行对应的是n门作业的过了截止时间扣的分数
输出扣的最小分数

解题思路

先对截止时间排序,如果截止时间相同哪个扣得分数大就放在前面。然后从前到后开始遍历,遍历到第i个开始的时候已经过了截止时间,然后记录下这个数和这个数对应的下标。在这个前面寻找一个最小扣的分数,来作为扣得分数,因为这个时候必须要扣分了,所以最好的方案就是扣最小的

AC代码

#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>using namespace std;const int MAXN = 5000;struct Node{    int score;    int dead;    bool flag;}work[MAXN];bool cmp(const Node a,const Node b){    if(a.dead!=b.dead)        return a.dead<b.dead;    return a.score>b.score;}int main(){    int t;    int workSum;    scanf("%d",&t);    while(t--)    {        scanf("%d",&workSum);        for(int i=0;i<workSum;i++)            scanf("%d",&work[i].dead);        for(int i=0;i<workSum;i++){            scanf("%d",&work[i].score);            work[i].flag  =false;        }        sort(work,work+workSum,cmp);        int sum=0,k=1;        for(int i=0;i<workSum;i++)        {            if(work[i].dead>=k){                k++;                continue;            }            int pos = i,tmpScore = work[i].score;            for(int j=0;j<i;j++)            {                if(work[j].score<tmpScore && !work[j].flag)                {                    tmpScore = work[j].score;                    pos = j;                }            }            sum+=tmpScore;            work[pos].flag = true;        }        printf("%d\n",sum);    }    return 0;}
0 0
原创粉丝点击