• 2015-2016 ACM-ICPC Pacific Northwest Regional Contest (Div. 2) S Surf


    Surf
    Now that you've come to Florida and taken up sur ng, you love it! Of course, you've realized that
    if you take a particular wave, even if it's very fun, you may miss another wave that's just about
    to come that's even more fun. Luckily, you've gotten excellent data for each wave that is going to
    come: you'll know exactly when it will come, how many fun points you'll earn if you take it, and
    how much time you'll have to wait before taking another wave. (The wait is due to the fact that
    the wave itself takes some time to ride and then you have to paddle back out to where the waves
    are crashing.) Obviously, given a list of waves, your goal will be to maximize the amount of fun
    you could have.
    Consider, for example, the following list of waves:
    Minute Fun points Wait time
    2 80 9
    8 50 2
    10 40 2
    13 20 5
    In this example, you could take the waves at times 8, 10 and 13 for a total of 110 fun points. If
    you take the wave at time 2, you can't ride another wave until time 11, at which point only 20 fun
    points are left for the wave at time 13, leaving you with a total of 100 fun points. Thus, for this
    input, the correct answer (maximal number of fun points) is 110.
    Given a complete listing of waves for the day, determine the maximum number of fun points
    you could earn.
    Input
    The rst line of input contains a single integer n (1  n  300;000), representing the total number
    of waves for the day. The ith line (1  i  n) that follows will contain three space separated
    integers: mi, fi, and wi, (1  mi; fi;wi  106), representing the time, fun points, and wait time
    of the ith wave, respectively. You can ride another wave occurring at exactly time mi + wi after
    taking the ith wave. It is guaranteed that no two waves occur at the same time. The waves may
    not be listed in chronological order.
    2015 Paci c Northwest Region Programming Contest|Division 2 17
    Output
    Print, on a single line, a single integer indicating the maximum amount of fun points you can get
    riding waves.
    Sample Input 
    4
    8 50 2
    10 40 2
    2 80 9
    13 20 5

    Sample Output
    110

    Sample Input
    10
    2079 809484 180
    8347 336421 2509
    3732 560423 483
    2619 958859 712
    7659 699612 3960
    7856 831372 3673
    5333 170775 1393
    2133 989250 2036
    2731 875483 10
    7850 669453 842

     Sample Output

    3330913

    题目链接:http://codeforces.com/gym/100819

    解法一:正常dp  优先队列转移

    /* ***********************************************
    Author        :guanjun
    Created Time  :2016/8/13 13:48:58
    File Name     :voh.cpp
    ************************************************ */
    #include <iostream>
    #include <cstring>
    #include <cstdlib>
    #include <stdio.h>
    #include <algorithm>
    #include <vector>
    #include <queue>
    #include <set>
    #include <map>
    #include <string>
    #include <math.h>
    #include <stdlib.h>
    #include <iomanip>
    #include <list>
    #include <deque>
    #include <stack>
    #define ull unsigned long long
    #define ll long long
    #define mod 90001
    #define INF 0x3f3f3f3f
    #define maxn 300100
    #define cle(a) memset(a,0,sizeof(a))
    const ull inf = 1LL << 61;
    const double eps=1e-5;
    using namespace std;
    
    struct Node{
        ll beg;
        ll end;
        ll val;
        int id;
    }nod[maxn];
    
    struct cmp{
        bool operator()(Node a,Node b){
            if(a.end==b.end) return a.beg<b.beg;
            return a.end>b.end;
        }
    };
    
    bool cmp1(Node a,Node b){
        if(a.beg==b.beg)return a.end<b.end;
        return a.beg<b.beg;
    }
    int n;
    ll dp[maxn][2];
    priority_queue<Node,vector<Node>,cmp>q;
    int main()
    {
        #ifndef ONLINE_JUDGE
        freopen("in.txt","r",stdin);
        #endif
        //freopen("out.txt","w",stdout);
        while(cin>>n){
            ll x;
            for(int i=1;i<=n;i++){
                scanf("%lld %lld %lld",&nod[i].beg,&nod[i].val,&x);
                nod[i].end=nod[i].beg+x;
            }
            sort(nod+1,nod+1+n,cmp1);
            int sum=0;
            for(int i=1;i<=n;i++)nod[i].id=i;
            while(!q.empty())q.pop();
            Node u,v;
            ll Max=0;
            cle(dp);
            for(int i=1;i<=n;i++){
                v=nod[i];
                q.push(v);
                while(!q.empty()){
                    u=q.top();
                    if(u.end<=v.beg){
                        q.pop();
                        Max=max(Max,dp[u.id][1]);
                    }
                    else break;
                }
                dp[i][1]=Max+nod[i].val;
                dp[i][0]=max(dp[i-1][1],dp[i-1][0]);
            }
            printf("%lld
    ",max(dp[n][1],dp[n][0]));
        }
        return 0;
    }

    解法二:依据时间dp

    /* ***********************************************
    Author        :guanjun
    Created Time  :2016/8/13 21:19:02
    File Name     :a.cpp
    ************************************************ */
    #include <iostream>
    #include <cstring>
    #include <cstdlib>
    #include <stdio.h>
    #include <algorithm>
    #include <vector>
    #include <queue>
    #include <set>
    #include <map>
    #include <string>
    #include <math.h>
    #include <stdlib.h>
    #include <iomanip>
    #include <list>
    #include <deque>
    #include <stack>
    #define ull unsigned long long
    #define ll long long
    #define mod 90001
    #define INF 0x3f3f3f3f
    #define maxn 1000010
    #define cle(a) memset(a,0,sizeof(a))
    const ull inf = 1LL << 61;
    const double eps=1e-5;
    using namespace std;
    priority_queue<int,vector<int>,greater<int> >pq;
    struct Node{
        int x,y;
    };
    struct cmp{
        bool operator()(Node a,Node b){
            if(a.x==b.x) return a.y> b.y;
            return a.x>b.x;
        }
    };
    
    bool cmp(int a,int b){
        return a>b;
    }
    ll dp[2*maxn];
    int v[maxn];
    int t[maxn],n;
    int main()
    {
        #ifndef ONLINE_JUDGE
        //freopen("in.txt","r",stdin);
        #endif
        //freopen("out.txt","w",stdout);
        cin>>n;
        int x;
        for(int i=0;i<n;i++){
            scanf("%d",&x);
            scanf("%d %d",&v[x],&t[x]);
        }
        for(int i=maxn-1;i>=0;i--){
            dp[i]=dp[i+1];
            if(v[i])
                dp[i]=max(dp[i],v[i]+dp[i+t[i]]);
        }
        printf("%lld
    ",dp[0]);
        return 0;
    }
  • 相关阅读:
    uva 489 Hangman Judge(水题)
    中国海洋大学第四届朗讯杯高级组 Cash Cow(模拟)
    中国海洋大学第四届朗讯杯高级组 A 2718 Rocky(模拟)
    poj 1039 Pipe(叉乘。。。)
    CodeForces 135 B. Rectangle and Square(判断正方形和 矩形)
    poj 1265 Area( pick 定理 )
    poj 2031 Building a Space Station(prime )
    hdu 4502 吉哥系列故事——临时工计划(dp)
    拉格朗日插值
    [USACO18DEC]The Cow Gathering P
  • 原文地址:https://www.cnblogs.com/pk28/p/5768915.html
Copyright © 2020-2023  润新知