教练提出的新思路,试了一下wa了只有60pts
  • 板块P1833 樱花
  • 楼主woshiren
  • 当前回复2
  • 已保存回复2
  • 发布时间2020/6/20 09:41
  • 上次更新2023/11/7 00:21:13
查看原帖
教练提出的新思路,试了一下wa了只有60pts
6322
woshiren楼主2020/6/20 09:41

大致思路是直接类似完全背包的正向循环,然后记录多一个使用次数的状态,不超过就可以继续选。

#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int ts,te,n,dp[10000005],t[10000005],c[10000005],p[10000005],rec[10000005];
int main()
{
    int s1,s2,t1,t2;
    scanf("%d:%d %d:%d %d",&s1,&s2,&t1,&t2,&n);
    ts=s1*60+s2;te=t1*60+t2;
    int limit=te-ts;
    for (int i=1;i<=n;i++) 
        scanf("%d%d%d",&t[i],&c[i],&p[i]);
    for (int i=1;i<=n;i++)
    {
        for (int j=0;j<=limit;j++) rec[j]=0;
        if (p[i]==0) p[i]=0x3f3f3f3f;
        for (int j=t[i];j<=limit;j++)
        {
            if (rec[j-t[i]]<p[i])
            {
                if (dp[j-t[i]]+c[i]>dp[j])
                {
                    dp[j]=dp[j-t[i]]+c[i];
                    rec[j]=rec[j-t[i]]+1;
                }
            }           
        }
    }
    printf("%d",dp[limit]);
    return 0;
}
2020/6/20 09:41
加载中...