1. 程式人生 > >新部落格地址:https://my.oschina.net/hebaodan/blog/

新部落格地址:https://my.oschina.net/hebaodan/blog/

思路:
按代價大小從高到低排序,代價一樣則最後期限早的在前,
按排序順序遍歷,事件安排進終止日期那一天,如果該日期已被那排,就在往前推,
如果最後安排不下,就扣分。

#include<iostream>
#include<algorithm>
using namespace std;
struct data
{
    int d,s;
}num[1005];
bool cmp(const data &a,const data &b)
{
    if(a.s!=b.s)
        return a.s>b.s;
    else
        return a.d<b.d;
}
int main()
{
    int t,n,sum,i,j;
    int tag[1005];//這天是否已被安排
    cin>>t;
    while(t--)
    {
        sum=0;
        cin>>n;
        for(i=0;i<n;i++)
        {
            cin>>num[i].d;
        }
        for(i=0;i<n;i++)
            cin>>num[i].s;
        sort(num,num+n,cmp);
        memset(tag,0,sizeof(tag));
        for(i=0;i<n;i++)
        {
            for(j=num[i].d;j>0;j--)
            {
                if(!tag[j])
                {
                    tag[j]=1;
                    break;
                }
            }
            if(!j)
                sum+=num[i].s;
        }
        cout<<sum<<endl;
    }
    return 0;
}