• ZOJ 3703 Happy Programming Contest(01背包的灵活运用)


    一道模拟刷题的题:

    输出能够获得的最高的分值;如果有相同的,输出做题数量多的;如果还有相同的,输出罚时少的。

    /*
    Problem :
    Status  :
    
    By wf,
    */
    
    #include "algorithm"
    #include "iostream"
    #include "cstring"
    #include "cstdio"
    #include "string"
    #include "stack"
    #include "cmath"
    #include "queue"
    #include "set"
    #include "map"
    
    #define lson l , m , rt << 1
    #define rson m + 1 , r , rt << 1 | 1
    
    typedef long long ll;
    using namespace std;
    
    const int inf=0x3f3f3f3f;
    const int maxn=1e5+5;
    
    int alltime,n;
    struct P
    {
        int time,attr;
    }p[maxn];
    
    bool cmp(P b, P c)
    {
        return b.time<c.time;
    }
    
    struct Node
    {
        int time;  //提交时间
        int attr;  //总吸引力
        int num;   //解决的题目数量
        int pena;  //总罚时
    }dp[maxn];
    
    void print_arr(int a[],int n)
    {
        for(int i=0; i<n; ++i)
        {
            printf("%d ",a[i]);
        }
        printf("
    ");
    }
    
    int main()
    {
        //freopen("in.txt","r",stdin);
        int t;
        scanf("%d",&t);
        while(t--)
        {
            memset(dp,0,sizeof dp);
    
            scanf("%d %d",&alltime,&n);
    
            for(int i=0; i<n; ++i)
            {
                scanf("%d",&p[i].time);
            }
            //sort(mytime,mytime+n);
            //print_arr(time,n);
            for(int i=0; i<n; ++i)
            {
                scanf("%d",&p[i].attr);
            }
    
            sort(p,p+n,cmp); // 不排序会错
    
            for(int i=0;i<n;++i)
            {
                for(int v = alltime;v>=0;v--)
                {
                    if( v<p[i].time )continue;
    
                    if( dp[v].attr < dp[ v-p[i].time ].attr + p[i].attr )
                    {
                        dp[v].attr = dp[ v-p[i].time ].attr + p[i].attr;
                        dp[v].num = dp[ v-p[i].time ].num + 1;
                        dp[v].time = dp[ v-p[i].time ].time + p[i].time;
                        dp[v].pena = dp[ v-p[i].time ].pena + dp[v].time;
                    }
                    else if( dp[v].attr == dp[ v-p[i].time ].attr + p[i].attr )
                    {
                        if( dp[v].num < dp[ v-p[i].time ].num +1 )
                        {
                            dp[v].num = dp[ v-p[i].time ].num +1;
                            dp[v].time = dp[ v-p[i].time ].time + p[i].time;
                            dp[v].pena = dp[ v-p[i].time ].pena + dp[v].time;
                        }
                        else if( dp[v].num == dp[ v-p[i].time ].num +1 )
                        {
                            if( dp[v].pena > dp[ v-p[i].time ].time + dp[ v-p[i].time ].pena  )
                            {
                                dp[v].time = dp[ v-p[i].time ].time + p[i].time;
                                dp[v].pena = dp[ v-p[i].time ].pena + dp[v].time;
                            }
                        }
                    }
                }
            }
    
            int ans = alltime;
            for(int i = alltime-1 ;i>=0;i--)
            {
                if( dp[ans].attr < dp[i].attr )ans = i;
                else if( dp[ans].attr == dp[i].attr )
                {
                    if( dp[ans].num < dp[i].num )ans = i;
                    else if( dp[ans].num == dp[i].num )
                    {
                        if( dp[ans].pena > dp[i].pena )ans=i;
                    }
                }
            }
    
    
    
            printf("%d %d %d
    ",dp[ans].attr,dp[ans].num,dp[ans].pena);
    
    
    
        }
    
        return 0;
    }
    

      

  • 相关阅读:
    数学
    数学
    Computer Science
    数学
    Computer Science
    元学习
    数学
    数学
    数学
    数学
  • 原文地址:https://www.cnblogs.com/bruce27/p/5492069.html
Copyright © 2020-2023  润新知