Cow Roller Coaster

Problem Description

The cows are building a roller coaster! They want your help to design as fun a roller coaster as possible, while keeping to the budget.

The roller coaster will be built on a long linear stretch of land of length L (1 ≤ L ≤ 1,000). The roller coaster comprises a collection of some of the N (1 ≤ N ≤ 10,000) different interchangable components. Each component i has a fixed length Wi (1 ≤ Wi ≤ L). Due to varying terrain, each component i can be only built starting at location Xi (0 ≤ Xi ≤ - Wi). The cows want to string together various roller coaster components starting at 0 and ending at L so that the end of each component (except the last) is the start of the next component.

Each component i has a "fun rating" Fi (1 ≤ Fi ≤ 1,000,000) and a cost Ci (1 ≤ Ci ≤ 1000). The total fun of the roller coster is the sum of the fun from each component used; the total cost is likewise the sum of the costs of each component used. The cows' total budget is B (1 ≤ B ≤ 1000). Help the cows determine the most fun roller coaster that they can build with their budget.

Input

Line 1: Three space-separated integers: <i>L</i>, <i>N</i> and <i>B</i>. <br>Lines 2..<i>N</i>+1: Line <i>i</i>+1 contains four space-separated integers, respectively: <i>X<sub>i</sub></i>, <i>W<sub>i</sub></i>, <i>F<sub>i</sub></i>, and <i>C<sub>i</sub></i>.

Output

扫描二维码关注公众号,回复: 2616978 查看本文章

Line 1: A single integer that is the maximum fun value that a roller-coaster can have while staying within the budget and meeting all the other constraints. If it is not possible to build a roller-coaster within budget, output -1.

Sample Input

 

5 6 10 0 2 20 6 2 3 5 6 0 1 2 1 1 1 1 3 1 2 5 4 3 2 10 2

Sample Output

 

17

排序后动规

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
struct node
{int x,w,f,c;
}a[10005];
#define ll long long
ll f [10005][10005];
bool cmp(node a,node b)
{
    if(a.x==b.x)
    return a.w<b.w;
    return a.x<b.x;
}
int main()
{
    int l,n,b;
    scanf("%d%d%d",&l,&n,&b);
    for(int i=1;i<=n;i++)
    scanf("%d%d%d%d",&a[i].x,&a[i].w,&a[i].f,&a[i].c);
    sort(a+1,a+1+n,cmp);
    memset(f,-1,sizeof(f));
    f[0][0]=0;
    for(int i=1;i<=n;i++)
    {int e=a[i].x+a[i].w;
        for(int j=b;j>=a[i].c;j--)
    if(f[a[i].x][j-a[i].c]>=0)
        f[e][j]=max(f[e][j],f[a[i].x][j-a[i].c]+a[i].f);

    }

    ll ans=-1;
    for(int i=1;i<=b;i++)
    ans=max(ans,f[l][i]);
    if(ans==-1)
    printf("-1\n");
    else
    printf("%d\n",ans);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/sdauguanweihong/article/details/81237799