HDU-5188zhx and contest(贪心+背包)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5188

题目大意:打比赛得积分,有n个题,要求达到w分,求最短时间,每个题有消耗时间t,得分v,以及一个限制l(完成该题的时间不能在l前面).

Sample Input

1 3
1 4 7
3 6
4 1 8
6 8 10
1 5 2
2 7
10 4 1
10 2 3

Sample Output

7
8
zhx is naive!

emmm,这个需要贪心配合背包,我们知道的是,如果他写1道题目要2分钟,但限制为4分钟,那么这多余的2分钟就会被浪费掉,所以我们必须先选择充分利用时间的,也就是$l-t$越小的越优。

排完序然后就是跑01背包了,自己定义一个时间时间上限作为背包容量即可跑板子了

以下是AC代码:

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;

const int mac=1e5+10;

long long dp[mac*30];
struct node
{
    int t,v,l;
    bool operator<(const node&a)const {
        return l-t<a.l-a.t;//越充分利用时间越优,浪费时间的后选
    }
}a[50];

int main()
{
    int n,w;
    while (~scanf ("%d%d",&n,&w)){
        memset(dp,0,sizeof dp);
        int s=0,ss=0;
        for (int i=0; i<50; i++)
            a[i].t=a[i].v=a[i].l=0;
        long long pt=0;
        for (int i=1; i<=n; i++){
            int t,v,l;
            scanf ("%d%d%d",&t,&v,&l);
            a[i]=node{t,v,l};
            pt+=v;
            s+=a[i].t;ss=max(a[i].l,ss);
        }
        if (pt<w) {printf("zhx is naive!\n"); continue;}
        int tot=max(s,ss)+10;
        sort(a+1,a+1+n);
        for (int i=1; i<=n; i++){
            for (int j=tot; j>=max(a[i].t,a[i].l); j--){
                dp[j]=max(dp[j],dp[j-a[i].t]+a[i].v);
            }
        }
        for (int i=0; i<=tot; i++)
            if (dp[i]>=w) {
                printf("%d\n",i);
                break;
            }
    }

    return 0;
}

 

posted @ 2020-07-07 22:02  lonely_wind  阅读(173)  评论(0编辑  收藏  举报