3 solutions

  • 2
    @ 2024-3-23 16:14:23
    #define ll long long
    #include<bits/stdc++.h>
    using namespace std;
    int ts1,ts2,te1,te2;
    //时间输入 
    char cc;
    //冒号输入 
    int n,T;
    //T 为时间限制 
    int t[10005],c[10005],p[10005];
    int dp[10005]={};
    //单数组存dp值 
    int main(){
    	cin>>ts1>>cc>>ts2>>te1>>cc>>te2>>n;
    	//利用cc白嫖冒号 
    	T=60*(te1-ts1)+(te2-ts2);
    	//计算时间 
    	for(int i=0;i<n;i++) cin>>t[i]>>c[i]>>p[i];
    	for(int i=0;i<n;i++){
    		if(!p[i]) for(int j=t[i];j<=T;j++) dp[j]=max(dp[j],dp[j-t[i]]+c[i]);
    		else for(int k=1;k<=p[i];k++) for(int j=T;j>=t[i];j--) dp[j]=max(dp[j],dp[j-t[i]]+c[i]);
    	}
    	//混合背包即可 
    	cout<<dp[T]<<"\n";
    	return 0;
    }
    

    简简单单 cc白嫖操作来源于hyd综合证3号患者

    • 2
      @ 2024-3-23 15:56:15

      P1833 樱花

      简简单单,混合背包问题罢了(时间计算看代码)

      代码:

      #include<bits/stdc++.h>
      using namespace std;
      int v[114514],w[114514],m[114514];//题目要求,v=C,w=T,m=P
      int dp[114514];//dp数组 
      int n,W;//W=Te-Ts
      int tshh,tsmm,tehh,temm;//数据格式 
      char c1,c2;//承接冒号,直接骗过题目 
      void dcbb(int n,int W) //混合背包二进制拆分(牢湿ppt上有) 
      {
      	for(int i=1; i<=n; i++)
      	{
      		for(int k=1; m[i]>0; k<<=1)
      		{
      			int x=min(k,m[i]);
      			for(int j=W; j>=w[i]*x; j--)
      			{
      				dp[j]=max(dp[j],dp[j-w[i]*x]+x*v[i]);
      			}
      			m[i]-=x;
      		}
      	}
      }
      int main()
      {
      	cin>>tshh>>c1>>tsmm>>tehh>>c2>>temm>>n;//题目输入格式,c1,c2可以白嫖冒号 
      	W=(tehh-tshh)*60+(temm-tsmm);//计算方式,由四大变量计算分钟 
      	for(int i=1; i<=n; i++)
      	{
      		cin>>w[i]>>v[i]>>m[i];//输入 
      		if(m[i]==0)m[i]=1441;//鉴于题目要求及题目给定时间在一天之内,当分钟数>1440时,相当于题目要求的时间无限 
      	}
      	dcbb(n,W);//调用函数 
      	cout<<dp[W]; 
      	return 0;
      }
      
      • 1
        @ 2024-3-24 12:25:55
        #include<cstdio>
        #include<algorithm>
        using namespace std;
        long long n;
        long long dp[10005];
        long long t[10005],mx[10005],cs[10005];
        long long h1,m1,h2,m2,m;
        long long ans,shu[100005],sj[100005],zcs;
        int main()
        {
            scanf("%lld:%lld %lld:%lld %lld",&h1,&m1,&h2,&m2,&n);
            m=(h2-h1)*60+(m2-m1);
            for(int i=1;i<=n;i++)
            {
                scanf("%lld%lld%lld",&t[i],&mx[i],&cs[i]);
            }
            for(int i=1;i<=n;i++)
            {
                if(cs[i]==0)
                {
                    cs[i]=100000;
                }
                for(int j=1;j<=cs[i];j*=2)
                {
                    ans++;
                    shu[ans]=mx[i]*j;
                    sj[ans]=t[i]*j;
                    cs[i]-=j;
                }
                if(cs[i]!=0)
                {
                    ans++;
                    shu[ans]=mx[i]*cs[i];
                    sj[ans]=t[i]*cs[i];
                }
            }
            for(int i=1;i<=ans;i++)
            {
                for(int u=m;u>=sj[i];u--)
                {
                    dp[u]=max(dp[u],dp[u-sj[i]]+shu[i]);
                }
            }
            printf("%lld\n",dp[m]);
            return 0;
        }
        
        • 1

        Information

        ID
        1034
        Time
        1000ms
        Memory
        128MiB
        Difficulty
        5
        Tags
        # Submissions
        22
        Accepted
        13
        Uploaded By