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;
}

 

posted @ 2015-03-10 16:18  伟gg  阅读(184)  评论(0编辑  收藏  举报