zoukankan      html  css  js  c++  java
  • SPOJ130 【DP·背包选取特性】

    题意:
    给你n个任务,每个任务有一个起始时间,持续时间,一个权值;

    问你怎么分配得到最大值

    思路:

    数据好大。。百度了一发意识到自己好菜啊!背包的特性。
    dp[i]代表前 i 个能构成的最大值。
    对于每个任务看成一个背包,背包取的点是固定的
    背包取的话肯定是离他开始时间最近的那个点,dp[i]=dp[k(结束时间最靠近他的起始时间的点)]+w[i];
    不取的话dp[i]=dp[i-1];

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long LL;
    const int N=1e5+10;
    
    int dp[N];
    struct asd{
        int L,R;
        int w;
    };
    asd q[N];
    int n;
    
    bool cmp(asd x,asd y)
    {
        return x.R<y.R;
    }
    
    int Find(int left,int right,int x)
    {
        while(left<right)
        {
            int mid=left+(right-left+1)/2;
            if(q[mid].R<x)
                left=mid;
            else
                right=mid-1;
        }
        return left;
    }
    
    int main()
    {
        int T;
        scanf("%d",&T);
        while(T--)
        {
            int x;
            scanf("%d",&n);
            q[0].L=q[0].R=q[0].w=0;
            for(int i=1;i<=n;i++)
            {
                scanf("%d%d%d",&q[i].L,&x,&q[i].w);
                q[i].R=q[i].L+x;
            }
            sort(q+1,q+n+1,cmp);
            int k;
            for(int i=1;i<=n;i++)
            {
                k=Find(0,i-1,q[i].L);
                dp[i]=max(dp[i-1],dp[k]+q[i].w);
            }
            printf("%d
    ",dp[n]);
        }
        return 0;
    }


  • 相关阅读:
    JS的运行机制
    Vue路由
    javascript的逼格
    Vue开发中遇到的问题及解决方案
    模块模式
    2019年终总结
    http知识总结
    小议函数的节流和防抖
    nodejs初探一二
    Object是个什么鬼
  • 原文地址:https://www.cnblogs.com/keyboarder-zsq/p/6777481.html
Copyright © 2011-2022 走看看