• 51 Nod 1636 教育改革(dp)


    1636 教育改革 

    题目来源: CodeForces

    基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题

     收藏

     关注

    最近A学校正在实施教育改革。

    一个学年由n天组成。A学校有m门课程,每天学生必须学习一门课,一门课程必须在一天内学习完。在学习完第i门课程后,学生们会收到 xi 个家庭作业,其中 xi是区间[ai,bi]里的一个整数 。每门课还有一个属性,就是复杂度 ci 。A学校现在要制他们的课程表,具体要求如下:

    ·在课程表中,随着天数的增加,课程的复杂度是严格递增的。

    ·除了第1天,每天的作业量必须是前一天的k倍,或者比前一天多k个作业。(假设第i天的作业量为 xi ,则对于i(1<i≤n)到满足 xi = k+xi−1 或 xi = k⋅xi−1 );

    现在,给定天数n,系数k,和m门课程的ai,bi,ci(1≤i≤m)。要求计算一个学年可以安排最大的总作业量( 总作业量的表达式是∑ni=1xi )是多少。

    Input

    单组测试数据
    第一行,三个由空格隔开的整数n,m,k(1≤n≤m≤50,1≤k≤100),表示一个学年的天数,课程的数量,和作业增量系数。
    接下来的m行,
    每行有三个整数,ai,bi,ci(1≤ai≤bi≤10^16,bi-ai≤100,1≤ci≤100)
    分别表示第i门课程的最小作业量,和最多作业量,以及复杂度。
    不同的课程可以有相同的复杂度。课程编号从1到m。

    Output

    如果有可行方案,第一行输出“YES”(没有引号),第二行输出最大的作业量。
    如果没有可行方案,则输出一行“NO”(没有引号)。

    Input示例

    4 5 2
    1 10 1
    1 10 2
    1 10 3
    1 20 4
    1 100 5

    Output示例

    YES
    78

    代码有点乱,基本思路就是状态的转移,多注意点细节就好啦

    
    #include<bits/stdc++.h>
    #include<stdio.h>
    #include<iostream>
    #include<cmath>
    #include<math.h>
    #include<queue>
    #include<set>
    #include<map>
    #include<iomanip>
    #include<algorithm>
    #include<stack>
    using namespace std;
    #define inf 0x3f3f3f3f
    typedef long long ll;
    int n,m,k;
    ll a[55];ll b[55];int c[55];
    int id[55];
    ll ans=0;bool ok=0;
    ll dp[55][55][105];
    bool cmp(int aa,int bb)
    {
        return c[aa]<c[bb];
    }
    int nxt(int j1)
    {
        int ret=j1+1;
        while(id[ret]<=m-1&&c[id[ret]]==c[id[j1]])ret++;
        return ret;
    }
    void solve()
    {
        for(int j=0;j<m;j++)
        {
            for(ll v=a[j];v<=b[j];v++)
            {
                dp[0][j][v-a[j]]=v;
            }
        }
    
        for(int i=1;i<=n-1;i++)
        {
            for(int j1=0;j1<m;j1++)
            {
                for(int j2=nxt(j1);j2<m;j2++)
                {
                    if(c[id[j2]]<c[id[j1]])continue;
                    for(ll v=a[id[j1]];v<=b[id[j1]];v++)
                    {
                        if(k+v>=a[id[j2]]&&k+v<=b[id[j2]]&&dp[i-1][id[j1]][v-a[id[j1]]]>0)
                            dp[i][id[j2]][k+v-a[id[j2]]]=max(dp[i][id[j2]][k+v-a[id[j2]]],dp[i-1][id[j1]][v-a[id[j1]]]+k+v);
                        if(k*v>=a[id[j2]]&&k*v<=b[id[j2]]&&dp[i-1][id[j1]][v-a[id[j1]]]>0)
                            dp[i][id[j2]][k*v-a[id[j2]]]=max(dp[i][id[j2]][k*v-a[id[j2]]],dp[i-1][id[j1]][v-a[id[j1]]]+k*v);
                    }
                }
            }
        }
    
        for(int j=0;j<m;j++)
        {
            for(ll v=a[j];v<=b[j];v++)
                ans=max(ans,dp[n-1][j][v-a[j]]);
        }
    }
    
    int main()
    {
    #ifndef ONLINE_JUDGE
        freopen("in.txt","r",stdin);
    #endif // ONLINE_JUDGE
        scanf("%d%d%d",&n,&m,&k);
        for(int i=0;i<m;i++)scanf("%lld%lld%d",&a[i],&b[i],&c[i]);
        for(int i=0;i<m;i++)id[i]=i;
        sort(id,id+m,cmp);
        solve();
        if(ans==0)cout<<"NO"<<endl;
        else {
            cout<<"YES"<<endl;
            cout<<ans<<endl;
        }
        return 0;
    }
    
    
    
  • 相关阅读:
    如何用php启动exe程序,并在进程中查看?
    如何用原生js或jquery设置select的值
    php5 升级 php7 版本遇到的问题处理方法总结
    phpexcel 读取日期的问题?
    PHPExcel_Reader_Exception: is not recognised as an OLE file in Classes问题解决方法
    QT Unexpected CDB exit 问题的解决办法
    html调用摄像头的方法汇总
    win7 32位 安装opencv-python后,运行时提示 "from .cv2 import *: DLL load failed: 找不到指定的模块" 的解决办法
    centos7 crontab 定时执行python任务不执行的原因及解决办法
    centos 7 生成文件名乱码的问题如何解决?
  • 原文地址:https://www.cnblogs.com/linruier/p/9832979.html
Copyright © 2020-2023  润新知