• 湘潭大学校赛I


    Interview Arrangement

    Accepted : 58   Submit : 349
    Time Limit : 5000 MS   Memory Limit : 65536 KB

    作为一名即将毕业大学生,小明即将参加一系列的面试,每场面试都有一个开始时间Si和一个结束时间Ti。小明可以选择参加面试或者放弃面试,但是迟到和早退是不允许的。每场面试对小明心都有不同的价值Vi。请你帮小明安排一些互不冲突的面试,使得最后参加面试的总价值最大。

    Input

    有多组测试数据。每组数据的第一行是一个整数1 ≤ N ≤ 100000。接下来N行,每行有三个整数0 ≤ Si < Ti ≤ 1000000000, -100000 ≤ Vi ≤ 100000.

    Output

    对每组测试数据,输出最大的总价值。

    Sample Input

    3
    1 2 1
    2 3 1
    3 4 1
    3
    1 3 1
    2 4 1
    3 5 1

    Sample Output

    3
    2
    #include"stdio.h"
    #include"stdlib.h"
    
    struct node
    {
        __int64 a,b;
        __int64 v;
        __int64 sum;
        int forward,num;
    }count[100005],count1[100005];
    
    int cmp(const void *a,const void *b)
    {
        node *aa=(node*)a,*bb=(node*)b;
        if(aa->b!=bb->b)
            return aa->b>bb->b?1:-1;
        else
            return aa->a>bb->a?1:-1;
    }
    
    int cmp1(const void *a,const void *b)
    {
        node *aa=(node*)a,*bb=(node*)b;
        if(aa->a!=bb->a)
            return aa->a>bb->a?1:-1;
        else
            return aa->b>bb->a?1:-1;
    }
    
    
    
    int main( )
    {
        int n,i,cnt;
        __int64 x;
        while(~scanf("%d",&n))
        {
            cnt=0;
            for(i=0;i<n;i++)
            {
                scanf("%I64d%I64d%I64d",&count[i].a,&count[i].b,&count[i].v);
                count[i].sum=count1[i].sum=0;//sum表示到此处所获得的价值最大是多少;
            }
            qsort(count,n,sizeof(node),cmp);//对原数据按结束时间排序;
            for(i=0;i<n;i++)
            {
                count1[i].a=count[i].a;count1[i].b=count[i].b;
                count[i].num=count1[i].num=i;//num表示按结束时间排序后所获得的相对顺序;
            }
            qsort(count1,n,sizeof(node),cmp1);//相对于开始时间排序;
            for(i=0;i<n;i++)                //本代码的纠结之处,通过相对顺序找出每个任务之前的那一个任务的序号,用forward表示;
            {
                if(count[i].b>count1[cnt].a)
                {
                    count[count1[cnt].num].forward=i-1;
                    cnt++;
                    i--;
                }
                if(cnt==n)
                    break;
            }
            for(i=0;i<n;i++)    //这里挺容易理解的dp找出每个任务结束后的最大价值;
            {
                if(count[count[i].forward].sum<0)
                    x=0;
                else
                    x=count[count[i].forward].sum;
                if(x+count[i].v>count[i-1].sum)
                    count[i].sum=count[i].v+x;
                else
                    count[i].sum=count[i-1].sum;
            }
            printf("%I64d\n",count[n-1].sum);
        }
        return 0;
    }
    
    
    
     
  • 相关阅读:
    no,no,不要使用kill -9
    Linux中etc目录详解
    Quartz任务调度器的使用
    RMI(Remote Method invocation,远程方法访问)
    SilverLight扩展控件RadTreeView
    SiverLight和HTML交互
    SilverLight控件之ContextMenu和RadContextMenu(菜单)
    SilverLight之向后台请求数据-WebClient
    SilverLight控件样式及控件模版
    在SilverLight中代码编写可选择树节点
  • 原文地址:https://www.cnblogs.com/chaosheng/p/2513405.html
Copyright © 2020-2023  润新知