HDU1789

//贪心,对时间按升序排序,如果时间相同则对分数按降序排序
//按时间顺序来对任务进行标记 能在今天完成则标记1,如果完成不了 则往前面找分数最小
//的进行交换,小的分数加入无法完成的分数.

#include<iostream>

#include<algorithm>

#include<cstring>

using namespace std;

struct homework

{

    int data;

    int score;

};

bool cmp(homework a,homework b)

{

    if(a.data==b.data)

        return a.score>b.score;//假如天数一样,就比较分数大小,大的放前面

    else

        return a.data<b.data;

}

int main()

{

    int t,i,j,min;

    int flag[1001];

    homework a[1001];

    int n,sum,temp,d;

    while(cin>>t){

    while(t--)

    {

        cin>>n;

        for(i=0;i<n;i++)

            cin>>a[i].data;

        for(i=0;i<n;i++)

            cin>>a[i].score;

        sum=0;

        sort(a,a+n,cmp);//排序

        memset(flag,0,sizeof(flag));

        d=1,temp=0;

        for(i=0;i<n;i++)

        {

            if(a[i].data>=d)//假如该天没作业,把a[i]定在该天完成

            {

                flag[i]=1;

                d++;

            }

            else //假如有已经有作业了,则找出分数最小的与之交换

            {

                min=a[i].score;

                temp=i;//temp为最小的分数的位置

                for(j=i-1;j>=0;j--)

                    if(flag[j]==1&&a[j].score<min)

                    {

                       min=a[j].score;

                        temp=j;



                    }

               sum+=a[temp].score;//sum相加

               a[temp].score=a[i].score;//交换



           }

        }

       cout<<sum<<endl;

    }

    }

    return 0;

}

 

你可能感兴趣的:(HDU)