zoukankan      html  css  js  c++  java
  • 1163-活动安排问题

    描述

     

    设有n个活动的集合E={1,2,……,n},其中每个活动都要求使用同一资源,如演讲会场等,而在同一时间内只有一个活动能使用这一资源。每个活动i都有一个要求使用该资源的起始时间si和一个结束时间fi,且si<fi。如果选择了活动i,则它在时间区间[si,fi]内占用资源。若区间[si,fi]与区间[sj,fj]不相交,则称活动i与活动j是相容的。也就是说,当si>=fj或者sj>=fi时,活动i与活动j相容。活动安排问题就是要在所给的活动集合中选出最大的相容活动子集合。

        但在现实生活中,不同的活动所带来的价值和意义是不一样的,所以我们可以为每个活动附上一个权值,现在的问题就是要在所给的活动集合中选出权值和最大的相容活动子集合。

    输入

     

    第一行输入一个正整数n(1<=n<=100000)为活动集合的大小 ,余下n行每行输入三个非负整数s,f,v分别代表活动的起始时间,结束时间和权值,(0<=s<f<=10000000 , 0<=v<=10000)。

    输出

    一行,权值和最大的相容活动子集合的权值和。

    样例输入

    3

    0 5 50

    6 9 49

    3 7 100

    样例输出

    100

    #include<iostream>
    #include<algorithm>
    using namespace std;
    inline int maxx(int x,int y) 
    {
        return x>y?x:y;
    }
    struct open
    {
        int s,f,v;
    };
    bool cmp(open x,open y)
    {
        return x.f<y.f;
    };
    open a[100001];
    int dp[100001];
    int main()
    {
        int n,i,k,left,right,mid;
        cin>>n;
        for(i=1;i<=n;i++)
            scanf("%d%d%d",&a[i].s,&a[i].f,&a[i].v);
        sort(a+1,a+n+1,cmp);
        for(i=1;i<=n;i++)
        {
            k=a[i].s,left=0,right=i;
            while(left+1<right)
            {
                mid=(left+right)/2;
                if(a[mid].f>k)
                    right=mid;
                else
                    left=mid;
            }
            k=right-1;
            dp[i]=maxx(dp[i-1],dp[k]+a[i].v);
        }
        cout<<dp[n]<<endl;
        return 0;
    }  
    

      

  • 相关阅读:
    解决linux下打开windows下压缩文件乱码的问题
    vim & emacs 强制修改 root 权限的文件
    在ubuntu下,给 svn diff 一点颜色
    sql优化(一)
    sql优化(二) 索引(一)
    Java反射与思想!
    JDK5.0枚举 泛型 注释
    忘羡的Day9!
    来博客的第二天!
    来博客第一天
  • 原文地址:https://www.cnblogs.com/Rosanna/p/3436978.html
Copyright © 2011-2022 走看看