洛谷P1156

国庆最后一天校集训队来了场模拟赛,发现本蒟蒻还是太弱了……(NOIP2007初赛真题57.5,上机模拟赛倒数

于是决定还是要多刷点题……然后做了道DP

==========分========割=========线==========

点击看题:洛谷P1156

一道怎么看怎么奇怪的DP,好像背包的说……
好吧,整道题决策其实就2个,丢下来的东西要么吃,要么堆
用f[i]表示时间为i时的最大高度,初始化全部为负无穷,f[10]=0
吃 f[i+a[j].eat]=max(f[i+a[j].eat],f[i])
不吃 f[i]+=a[j].height
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
#define Max 9999973
#define repu(i,l,r) for(int i=l;i<=r;i++)
#define repd(i,r,l) for(int i=r;i>=l;i--)
using namespace std;

struct d
{
    int time,eat,height;
}data[200];
int n,m,f[4000],k,ans;
bool cmp(d a,d b)
{
    return a.time<b.time;
}
int main()
{
    scanf("%d%d",&n,&m);
    d da;
    repu(i,1,m)
    {
        scanf("%d%d%d",&da.time,&da.eat,&da.height);
        data[i]=da;
    }
    sort(data+1,data+m+1,cmp);
    memset(f,192,sizeof(f));
    f[10]=0;
    repu(i,1,m)
    {
        repd(j,data[m].time,data[i].time)
        {
            f[j+data[i].eat]=max(f[j+data[i].eat],f[j]);
            f[j]+=data[i].height;
        }
        repd(j,data[m].time+data[i].eat,data[i].time)
        {
            if (f[j]>=n)
            {
                printf("%d",data[i].time);
                return 0;
            }
        }
    }
    for(ans=10,k=1;k<=m&&ans>=data[k].time;k++)
    ans+=data[k].eat;
    printf("%d",ans);
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值