zoukankan      html  css  js  c++  java
  • 51nod 1636 教育改革

    题目链接

    令f[i][j][k]为第i天选择的课程为j,设置作业为a[j]+k时的最大作业量.

    那么f[i][j][k]可以由哪些状态转移而来?先把课程按复杂度排序,那么可以转移来的课程是f[i-1][t][r],

    其中t是<j,且复杂度a[t].c严格小于a[j].c. 这是前提条件, 其次, 对于a[t]布置的作业数量r,根据题意需要满足作业j布置的作业(a[j]+k) % r == 0,或者是 (a[j]+k) - K = r. 在这些状态转移中取最值即可.

    需要留意的地方:因为bi-ai<=100,也就是说布置的作业量的状态属于[ai,bi],所以我们用差值来记录布置了多少作业,没必要朴素的真的去记录布置作业量,因为ai<=10^16..太大了.

    其次,要用long long, 各个地方都别漏了. 再其次,转移的时候,需要上一个状态合法,即上一个状态的值非0.

    
    #include<bits/stdc++.h>
    using namespace std;
    
    #define ll long long
    #define FOR(i,a,b) for(int i=(a);i<=(b);++i)
    
    ll N, M, K, cas;
    struct node{ll l, r, c;} a[55];
    bool cmp(node a, node b) {return a.c < b.c;}
    bool ok(ll v, node nd) {return nd.l <= v && v <= nd.r;}
    ll f[55][55][105], ans;
    
    int main () {
        while (~scanf("%lld%lld%lld", &N, &M, &K)) {
            ans = 0;
            memset(f, 0, sizeof f);
            FOR(i, 1, M) scanf("%lld%lld%lld", &a[i].l, &a[i].r, &a[i].c);
            sort(a + 1, a + 1 + M, cmp);
            FOR(i, 1, M)
                FOR(j, 0, a[i].r - a[i].l)
                    f[1][i][j] = a[i].l + j;
    
            FOR(i, 2, N) {
                FOR(j, 2, M) {
                    FOR(t, 1, j - 1) {
                        if (a[j].c <= a[t].c) continue;
                        FOR(k, 0, a[j].r - a[j].l) {
                            ll pre = a[j].l + k - K;
                            ll &cur = f[i][j][k];
                            if (ok(pre, a[t]) && f[i - 1][t][pre - a[t].l])
                               cur = max(cur, f[i - 1][t][pre - a[t].l] + a[j].l + k);
                            pre = (a[j].l + k) / K;
                            if ((a[j].l + k) % K == 0 && ok(pre, a[t])
                                    && f[i - 1][t][pre - a[t].l])
                               cur = max(cur, f[i - 1][t][pre - a[t].l]
                                       + a[j].l + k);
                        } 
                    }
                }
            }
            FOR(i, 1, M)
                FOR(j, 0, a[i].r - a[i].l)
                    ans = max(ans, f[N][i][j]);
            if (ans) printf("YES
    %lld
    ", ans);
            else puts("NO");
        }
        return 0;
    }
    
  • 相关阅读:
    我的Vue朝圣之路2
    我的Vue朝圣之路1
    1.Rabbitmq学习记录《本质介绍,协议AMQP分析》
    IdentityServer4(客户端授权模式)
    windows10环境下的RabbitMQ使用_笔记
    windows10环境下的RabbitMQ安装_笔记
    asp.net Code CSRedis学习记录
    visual studio code 命令行创建发布一个项目
    RabbitMQ学习记录1
    AspNetCore Redis实现分布式缓存
  • 原文地址:https://www.cnblogs.com/Rosebud/p/9696263.html
Copyright © 2011-2022 走看看