SDJZU_新生_贪心_Doing Homework again

昨天就是练练手,培训今天才开始
SDJZU_新生_贪心
27:28:20
30:00:00
Current Time: 2015-01-24 18:58:19Contest Type: Private
Start Time: 2015-01-23 15:30:00Contest Status: Running
End Time: 2015-01-24 21:30:00Manager: ACboy
nickname改成自己真实姓名
D - Doing Homework again
Crawling in process... Crawling failed Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u

Description

Ignatius has just come back school from the 30th ACM/ICPC. Now he has a lot of homework to do. Every teacher gives him a deadline of handing in the homework. If Ignatius hands in the homework after the deadline, the teacher will reduce his score of the final test. And now we assume that doing everyone homework always takes one day. So Ignatius wants you to help him to arrange the order of doing homework to minimize the reduced score.
 

Input

The input contains several test cases. The first line of the input is a single integer T that is the number of test cases. T test cases follow.
Each test case start with a positive integer N(1<=N<=1000) which indicate the number of homework.. Then 2 lines follow. The first line contains N integers that indicate the deadlines of the subjects, and the next line contains N integers that indicate the reduced scores.
 

Output

For each test case, you should output the smallest total reduced score, one line per test case.
 

Sample Input

       
       
3 3 3 3 3 10 5 1 3 1 3 1 6 2 3 7 1 4 6 4 2 4 3 3 2 1 7 6 5 4
 

Sample Output

       
       
0 3 5

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
struct A
{
    int time,grade;
}a[1007];
int cmp(A a,A b)
{
    if(a.grade==b.grade)
    {
        return a.time<b.time;
    }
    return a.grade>b.grade;
}
int main()
{
    A a[1007];
    int T,i;
    scanf("%d",&T);
    while(T--)
    {
        int N,sum=0,b[1007],c,d;
        scanf("%d",&N);
        for(i=0;i<N;i++)
        {
            scanf("%d",&a[i].time);
        }
        for(i=0;i<N;i++)
        {
            scanf("%d",&a[i].grade);
        }
        sort(a,a+N,cmp);
        memset(b,0,sizeof(b));
        for(i=0;i<N;i++)
        {
            int f;
            c=a[i].time;
            if(b[c]==0)
            {
                b[c]=a[i].grade;
            }
            else
            {
                for(d=c;d>0;d--)
                {
                    f=0;
                    if(b[d]==0)
                    {
                        f=1;
                        b[d]=a[i].grade;
                        break;
                    }
                }
                if(f==0)
                {
                    sum+=a[i].grade;
                }
            }
        }
        printf("%d\n",sum);
    }
    return 0;
}


Submit

Problem:
Language:
Public:
        Rank Setting
        评论
        添加红包

        请填写红包祝福语或标题

        红包个数最小为10个

        红包金额最低5元

        当前余额3.43前往充值 >
        需支付:10.00
        成就一亿技术人!
        领取后你会自动成为博主和红包主的粉丝 规则
        hope_wisdom
        发出的红包
        实付
        使用余额支付
        点击重新获取
        扫码支付
        钱包余额 0

        抵扣说明:

        1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
        2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

        余额充值