国庆最后一天校集训队来了场模拟赛,发现本蒟蒻还是太弱了……(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;
}