zoukankan      html  css  js  c++  java
  • Codeforces 119C DP

    题意:

    有n天,m门课和常数k;

    每天上一门课,每门课程有两个属性,最少作业量a,最多作业量b,和难度c。

    1<=a<=b<=1e16

    c<=100

    1<=n<=m<=50 1<=k<=100

    要求所有课程的作业量总和最多。

    要求除第一天外,其他情况下作业量是前一天加k或者前一天乘k。

    输出每天课程的序号,以及该课程应该布置的作业量。

    思路:

    dp[i][j][k]代表第i门课,第j作业量,第k天的总和。

    注意j是相对最少作业量的位移量。

    #include<bits/stdc++.h>
    using namespace std;
    struct st{
        int id,c;
        unsigned long long a,b,num;
    };
    bool cmp(st a,st b){
        return a.c<b.c;
    }
    st jilu[100];
    unsigned long long dp[55][105][55];
    int fi[55][105][55],fj[55][105][55];
    stack<pair<unsigned long long,int> >ss;
    int main()
    {
        int n,m;
        unsigned long long kk;
        scanf("%d%d%I64u",&n,&m,&kk);
        for(int i=0;i<m;i++){
            int tmp;
            scanf("%I64u%I64u%d",&jilu[i].a,&jilu[i].b,&jilu[i].c);
            jilu[i].num=jilu[i].b-jilu[i].a;
            jilu[i].id=i+1;
        }
        sort(jilu,jilu+m,cmp);
        for(int i=0;i<m;i++){
            for(int k=1;k<=n;k++){
                for(int j=0;j<=jilu[i].num;j++){
                    if(i==0){
                        if(k==1)
                            dp[i][j][k]=j+jilu[i].a;
                    }
                    else if(k==1){
                        dp[i][j][k]=j+jilu[i].a;
                    }
                    else{
                        long long t=jilu[i].a+j-kk;
                        for(int w=0;w<i;w++){
                            if(jilu[w].c>=jilu[i].c)break;
                            if(jilu[w].a>t||jilu[w].b<t)continue;
                            long long tt=t-jilu[w].a;
                            if(dp[w][tt][k-1]){
                                if(dp[i][j][k]<jilu[i].a+j+dp[w][tt][k-1]){
                                    dp[i][j][k]=jilu[i].a+j+dp[w][tt][k-1];
                                    fi[i][j][k]=w;
                                    fj[i][j][k]=tt;
                                }
                            }
                        }
                        t=jilu[i].a+j;
                        if(t%kk==0){
                            t/=kk;
                            for(int w=0;w<i;w++){
                                if(jilu[w].c>=jilu[i].c)break;
                                if(jilu[w].a>t||jilu[w].b<t)continue;
                                long long tt=t-jilu[w].a;
                                if(dp[w][tt][k-1]){
                                    if(dp[i][j][k]<jilu[i].a+j+dp[w][tt][k-1]){
                                        dp[i][j][k]=jilu[i].a+j+dp[w][tt][k-1];
                                        fi[i][j][k]=w;
                                        fj[i][j][k]=tt;
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
        long long ans=0;
        int idi,idj;
        for(int i=0;i<m;i++){
            for(int j=0;j<=jilu[i].num;j++){
                if(ans<dp[i][j][n]){
                    ans=dp[i][j][n];
                    idi=i;
                    idj=j;
                }
            }
        }
        if(ans==0){
            puts("NO");
            return 0;
        }
        while(n--){
            int n_idi=fi[idi][idj][n+1];
            int n_idj=fj[idi][idj][n+1];
            if(n!=0)
                ss.push(make_pair(dp[idi][idj][n+1]-dp[n_idi][n_idj][n],jilu[idi].id));
            else
                ss.push(make_pair(dp[idi][idj][n+1],jilu[idi].id));
            idi=n_idi;idj=n_idj;
        }
        puts("YES");
        while(!ss.empty()){
            pair<unsigned long long,int>t=ss.top();
            ss.pop();
            printf("%d %I64u
    ",t.second,t.first);
        }
    }
  • 相关阅读:
    uboot的Makefile分析
    S3C2440上触摸屏驱动实例开发讲解(转)
    linux嵌入式驱动软件开发(csdnblog)
    [连接]研究MSN的一些参考资料(MSNP15)
    关于Asp.net中使用以下代码导出Excel表格的问题
    FCKEditor在Asp.net的安装
    奥运后,接手两个项目,PECT培训,CIW培训,系分考试...........一堆流水帐
    [转]甩掉数据字典,让Sql Server数据库也来一个自描述
    SQL Server 调优将会用到的非常好的DMV
    SQL Server 监视数据文件大小变化
  • 原文地址:https://www.cnblogs.com/tun117/p/5461361.html
Copyright © 2011-2022 走看看